Странная жалоба компилятора при использовании аналогичного кода - PullRequest
0 голосов
/ 20 марта 2011

Для проекта мне нужно спросить у пользователя имя файла, и я читаю его по буквам, используя getchar.

Из основного я вызываю функцию char *coursename= introPrint(); //start off, чтобы напечатать инструкции по использованию и получить первый бит ввода. Эта функция определяется как

char *introPrint(){
  int size= 20;
  int c;
  int length=0;
  char buffer[size];


  //instructions printout, cut for brevity

  //get coursename from user and return it
  while ( (c=getchar()) != EOF && (c != '\n') ){
    buffer[length++]= c;
    if (length==size-1)
      break;

  }
  buffer[length]=0;
  return buffer;
}

Это в основном идентичный код, который я написал, чтобы попросить пользователя ввести, заменить символьное эхо звездочками, а затем распечатать результаты. Здесь, однако, я получаю предупреждение function returns address of local variable для оператора return. Так почему же я не получаю предупреждения от другой программы, но запускаю одно для этого кода?

Ответы [ 5 ]

3 голосов
/ 20 марта 2011

Вы возвращаете адрес buffer, который уничтожается, когда он выходит из области видимости (когда функция возвращается). Когда вы пытаетесь использовать возвращенный указатель, поведение программы не определено: программа может повторно использовать память, в которой ранее находился экземпляр buffer, для других целей.

Используйте буфер static, выделите его с помощью malloc или позвольте вызывающему пройти в буфер. В последнем случае функция и ее вызывающая сторона также должны каким-то образом сообщать о длине буфера (например, с помощью дополнительного аргумента size).

1 голос
/ 20 марта 2011

Потому что здесь вы действительно возвращаете указатель на локальную (для области видимости функции) переменную:
char buffer[size];

Итак, после выполнения функции этот массив уничтожается и указатель становится недействительным, и вы получаете неопределенное поведение.

Чтобы исправить это, вы должны динамически распределять массив, используя malloc:

char* buffer = (char*)malloc( size * sizeof( char ) );
1 голос
/ 20 марта 2011

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

Лучше определить выделение памяти под вашим именем и затем передать указатель на вашу функцию или динамически распределить буферную память.

0 голосов
/ 20 марта 2011

когда вы объявляете буфер char [], он помещает этот буфер в стек. Когда функция завершается, стек извлекается и буфер перестает существовать. Если вы хотите вернуть динамический буфер, вызовите malloc () (или GlobalAlloc () в Windows или, при необходимости, используйте оператор new в c ++).

Ключевое слово static заставит буфер существовать вне стека, по сути, такой же, как глобальный, только недоступный вне функции.

0 голосов
/ 20 марта 2011

Просто предположение, что вы не вернули указатель на буфер в другой функции.

Проблема в том, что все локальные переменные уничтожаются при возврате функции. Это означает, что возвращенный указатель больше нигде не указывает. Там нет буфера. Не хорошо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...