我想了解从函数调用返回指针的行为。假设我有以下简单代码:
int main(){
int i;
float *ssd;
ssd = test();
for (i = 0; i < 3; ++i) {
printf("%f, ", ssd[i]);
}
printf("\n \n");
memset(ssd, 0.0, 3*sizeof(float));
for (i = 0; i < 3; ++i) {
printf("%f, ", ssd[i]);
}
printf("\n \n");
}
float *test(){
float *buff = malloc(3* sizeof(float));
int i;
for (i = 0; i < 3; ++i) {
buff[i] = (float) (6.31 + i);
}
free(buff);
return buff;
}
如您所见,我在 test()
中创建了一个临时缓冲区 buff
。在返回之前,我在 return
语句之前释放了 buff
。尽管我对其进行了测试并且结果符合预期,但我不明白 test()
函数如何返回 buff
值,即使 free(buff)
是在 return
buff 之前?
最佳答案
之后
free(buff);
任何取消引用 buff
的进一步操作都是未定义的行为。
您的函数 test()
分配了一个缓冲区,但随后在将其返回给 main
之前将其释放
,如 ssd
.
所以当 ssd
在 main
中被取消引用时,虽然指针仍然具有由 malloc
分配的相同值,但它不再指向你“拥有”的内存。所以从那时起,任何事情都可能发生。您的代码可能仍然有效,也可能无效。
关于c - 了解 return 语句之前的 free() 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39690836/