好吧,我知道释放缓冲区后读取缓冲区是错误的。我试图证明 free() 不会触及缓冲区中存储的数据,但我无法证明:)
这是代码
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *p = malloc(3);
char *s = p;
memcpy(p, "aaa", 3);
free(p);
printf(" s = ");
for(int i=0; i<10; i++)
{
printf("%c", s[i]);
}
printf("\n");
return 0;
}
% ./a.out
s = 0?I-E3?
每次运行它,输出都是不同的。
我所看到的有解释吗?现代 malloc 库是否潜入了一些安全功能?如果重要的话,这是在 Mac 上。
我希望看到“aaa”,我怎么看到0?I-E3?
是的。首先,您读取的字符超出了分配的空间,没有理由假设每次测试时的信息都是相同的。
但是
假设您只循环到分配的数量,即使这样,释放资源基本上也释放了对其的控制,因此无法保证随后它将继续存储您的数据。