Ada*_*dam 0 c pointers memory-management
我想了解从函数调用返回指针的行为.假设我有以下简单代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
如你所见,我在buff里面创建了一个临时缓冲区test().在我回来之前,我buff在return声明之前释放了.虽然我测试了它并且结果是预期的,但我不明白test()函数如何返回buff值,即使free(buff)是在returnbuff 之前?
后
free(buff);
Run Code Online (Sandbox Code Playgroud)
取消引用的任何进一步操作buff都是未定义的行为.
你的功能test()分配一个缓冲区,但随后free将其返回到之前的IT main作为ssd.
因此,当ssd取消引用时main,尽管指针仍具有与其分配的相同值malloc,但它不再指向您"拥有"的内存.从那时起,任何事情都可能发生.您的代码可能仍然有效,或者可能没有.
| 归档时间: |
|
| 查看次数: |
1917 次 |
| 最近记录: |