为什么我的char *返回不同的值?

时间:2016-02-25 22:22:30

标签: c arrays pointers buffer

我有一个看起来像这样的函数:

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 ,我无法弄清楚原因。

2 个答案:

答案 0 :(得分:1)

缓冲区result将在从函数function1()返回时消失,访问消失的缓冲区(通过返回的指针)将调用未定义的行为

char result[16];更改为static char result[16];会阻止result消失,除非您在多线程和中断处理程序中使用该函数,否则应该使其工作。 (此更改将使函数不可重入)

答案 1 :(得分:0)

每次进入函数体时,系统都会从堆栈中保留一定量的内存,该内存量等于本地声明的变量的大小。当它返回它时,释放内存就像推送和放大一样。流行。因此,本地声明的变量消失,并且堆栈由其他函数重用,这些函数从堆栈中为其本地声明的变量回收一定量的空间。当返回时,本地声明的变量的指针不能在函数外部重用,因为堆栈现在由其他函数拥有,或者尚未分配。