Проблема заключается в возврате с fun
, который возвращает адрес локальной переменной. Этот адрес становится недействительным в тот момент, когда функция возвращается. Вам просто повезет с первого звонка до printf
.
Несмотря на то, что локальный технически разрушен, когда fun
возвращается, C runtime ничего не делает, чтобы активно его уничтожить. Следовательно, ваше первое использование *j
- это , работающее, потому что память для местного еще не написана. Реализация printf
, скорее всего, может быть написана просто с использованием собственных локалей в методе. Следовательно, во втором использовании *j
вы имеете в виду все местные printf
, а не k
.
Для выполнения этой работы вам необходимо вернуть адрес, который указывает на значение, которое проживает дольше fun
. Как правило, в C это достигается с malloc
int *fun() {
int* pValue = malloc(sizeof(int));
*pValue = 23;
return pValue;
}
Поскольку возвращение malloc
жизни, пока вы звоните free
это будет действовать на нескольких использований printf
. Один улов - это вызывающая функция, которая теперь должна сообщать программе, когда она выполняется с повторным соединением fun
. Для того, чтобы сделать этот вызов free
после второго вызова printf
j=fun();
printf("%d\n",*j);
printf("%d\n",*j);
free(j);
ответ здесь http://stackoverflow.com/questions/20880084/pointers-and-function-arguments/20880143#20880143 – HAL9000