我有一个看起来像这样的函数:
char *function1(){
//SOME CODE HERE
char result[16];
char *ptr = result;
return ptr;
}
这样做的是计算一些值(128位),将其存储在char缓冲区中,然后返回指向缓冲区的指针。
我使用以下内容在function1
内打印出缓冲区:
for (i = 0; i < 16; i++)
printf("%02X ", result[i]);
printf("\n");
结果是128位值并打印出来。
现在在另一个函数中,我有以下代码
char *ptr_to_result = function1();
我再次使用这段代码打印它:
for (i = 0; i < 16; i++)
printf("%02X ", ptr_to_result[i]);
printf("\n");
result2 是打印出来的128位值。
出于某种原因结果!= result2 ,我无法弄清楚原因。
答案 0 :(得分:1)
缓冲区result
将在从函数function1()
返回时消失,访问消失的缓冲区(通过返回的指针)将调用未定义的行为。
将char result[16];
更改为static char result[16];
会阻止result
消失,除非您在多线程和中断处理程序中使用该函数,否则应该使其工作。 (此更改将使函数不可重入)
答案 1 :(得分:0)
每次进入函数体时,系统都会从堆栈中保留一定量的内存,该内存量等于本地声明的变量的大小。当它返回它时,释放内存就像推送和放大一样。流行。因此,本地声明的变量消失,并且堆栈由其他函数重用,这些函数从堆栈中为其本地声明的变量回收一定量的空间。当返回时,本地声明的变量的指针不能在函数外部重用,因为堆栈现在由其他函数拥有,或者尚未分配。