我需要一些免费的帮助。
当我运行以下命令时:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char *mystring = malloc(6 * sizeof(char));
strcpy(mystring, "Hello");
printf("%p\n", mystring);
printf("%s\n", mystring);
free(mystring);
printf("%p\n", mystring);
printf("%d\n", *mystring);
return 0;
}
我得到:
0x8f46008
Hello
0x8f46008
0
free()是否将内存中的字符串“Hello”替换为零?
注意:这只是为了学术目的我永远不会真正引用释放的内存。
谢谢,
弗兰克
最佳答案
一旦你有了一个内存块,再次读取该内存将导致未定义的行为,这是一个严重的安全和稳定隐患。对于free
d的内存,您不能指望任何值为true,因此无法保证内存是否为零。除非你完全确定自己在做什么,否则不要在释放内存后引用它。
作为一个有趣的轶事,最初的SimCity游戏有一个bug,它引用了被释放的内存。在DOS中,这不会导致崩溃,但当它被移植到Windows时,游戏开始反复崩溃。Windows团队必须在操作系统中专门构建一个case,这样如果运行SimCity,就可以使用自定义内存管理器来防止这种崩溃。你可以阅读完整的故事。
简而言之,一旦它被释放,就不要碰它。否则你会冒着错误的风险,一些可怜的程序员会在接下来的几年里为你修复这些错误。像ValgRink这样的工具专门用来检测这些错误,因为它们太讨厌了。
希望这有帮助!
关于c - free()将字符串替换为零?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9123206/