функции, возвращающие указатель на символ - PullRequest
5 голосов
/ 26 февраля 2010

Я натолкнулся на множество функций, возвращающих указатели на символы в одном устаревшем приложении. Некоторые из них возвращают указатели на локальные массивы символов. Кажется, это вызывает сбои после нескольких вызовов (не сразу!), См. Использование ниже

char *f1(){
  char buff[20];
  char *ptr;

  ----
  ----
  ptr=buff;
 return ptr;
}

---
---

f2(f1());

f1 () возвращает локальную переменную-указатель и затем передает ее другой функции. Я получил сбой непосредственно, когда он скомпилирован с использованием режима _DEBUG в MS DEV. Но в режиме выпуска это не вызывает немедленного сбоя, но это может произойти после выполнения множества таких вызовов.

Когда я изменил использование, как показано ниже, оно работает без проблем. Является ли следующее использование безопасно?

strcpy(arr,f1()); /* arr is fixed char array*/
f2(arr);

Ответы [ 12 ]

0 голосов
/ 26 февраля 2010

Я бы предложил два возможных решения:

  1. Используйте статический char buff[20] в f1, если только функция не вызывается из нескольких потоков или внешний мир хранит указатель за пределами strcpy.

  2. Используйте return strdup (ptr); и free указатель снаружи f1. Это проще в использовании, чем malloc (хотя технически то же самое). Это медленнее, чем 1. но потокобезопасен.

0 голосов
/ 26 февраля 2010

На самом деле, лучше всего было бы изменить f1 () для использования malloc (). Ваше решение не соответствует определенному поведению.

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