Подтвердить что ты не робот

Обратный адрес локальной переменной в C

Скажем, что у меня есть следующие две функции:

1

int * foo()
{
  int b=8;
  int * temp=&b;
  return temp;
}

2

int * foo()
{
   int b=8;
   return &b;
}

Я не получаю предупреждения для первого (например, функция возвращает адрес локальной переменной), но я знаю, что это незаконно, поскольку b исчезает из стека, и мы оставляем указатель на undefined память.

Итак, когда мне нужно быть осторожным при возврате адреса временного значения?

4b9b3361

Ответ 1

Причина, по которой вы не получаете предупреждение в первом фрагменте, состоит в том, что вы не являетесь (с точки зрения компилятора), возвращая адрес локальной переменной.

Вы возвращаете значение int * temp. Несмотря на то, что эта переменная может быть (и в этом примере) содержать значение, которое является адресом локальной переменной, компилятор не будет поднимать стек выполнения кода, чтобы убедиться, что это так.

Примечание. Оба эти фрагмента одинаково плохи, хотя ваш компилятор не предупреждает вас о первом. Не используйте этот подход.


Вы всегда должны быть осторожны при возврате адресов локальным переменным; как правило, вы можете сказать, что вы никогда.

static переменные - это совсем другой случай, который обсуждается в этой теме.

Ответ 2

я бы сказал, что вы можете вернуть локальную переменную или, скорее, указатели на такой IF, если она была динамически распределена malloc, в этом случае память, используемая для хранения переменной, должна быть в стеке, но в куче и не будет очищена или повторно - после выхода из функции, как это происходит в случае автоматических локальных переменных (созданных без malloc), я прав?

Ответ 3

Оба примера одинаково неверны. Я предполагаю, что ваш компилятор не видит опасности и, таким образом, не выдает предупреждения, когда вы храните адрес во временной переменной.

Ответ 4

Этот вопрос, вероятно, один из самых обсуждаемых в StackO. Ниже приведены два ответа из похожих потоков на StackO, которые я нашел интересными, и, вероятно, заставили меня оставить эту плохую практику удаления ссылок на локальные переменные, несмотря на то, что я ошибаюсь (поведение undefined) очень тонкое.

Вот простой ответ

Мне особенно понравился этот ответ.

Вот пример, когда эта плохая практика вызвала некоторые реальные повреждения оборудования

Ответ 5

Они оба плохие, и хороший компилятор должен иметь возможность обнаруживать и предупреждать обо всех ситуациях. Вы можете получить лучшие результаты, указав уровень предупреждения до максимума (который всегда должен делать в любом случае) и включите оптимизацию.