char* foo = malloc(sizeof(char));
*(foo + 1) = 'c';
在调试器中,我看到foo
是指向大小为5
的字符数组的指针。为什么?!
在调试器中,我看到
foo
是一个指向大小为5的char数组的指针。为什么?!
因为调试器并不完美。当显示char *
时,调试器通常假设它指向C字符串(以null字符结尾的char
数组(,并以这种方式显示它。但是,您只分配了1个字节的数据。后面的字符是调试器显示的内存的前一个内容。在您的情况下,在看到null之前,内存碰巧又包含了三个非null字符,这就是调试器总共显示五个字符的原因。
此外,您的代码有一个错误,它在分配的界限之外写入。*foo = 'c'
和foo[0] = 'c'
是合法的,但*(foo + 1) = 'c'
是未定义的行为。
如果不知道使用哪种编译器、运行库和操作系统,很难准确回答。
一般来说,malloc()
操作从大面积的RAM中划出空间。它将记账信息放在它给你的空间之前和之后,所以当你free()
这个空间时,它可以让它用于另一个malloc()
。如果你覆盖了记账信息,混乱可能随之而来。
malloc()
不会承诺将它给您的内存空间清零。从形式上讲,它给你的新记忆空间的内容是不可预测的所以,当你用调试器检查一个新分配的空间块时,你会看到该空间的前一个用户留下的任何数据。如果要将空间归零,请使用calloc()
。(提示:除非您正在编写性能非常关键的代码,否则您可能确实希望它为零。(
此外,malloc()
还给出字对齐空间。如果在一台64位机器上执行一系列malloc(3)
操作,每个操作返回的地址都是零模8。它通常会分配一点额外的空间来做这件事。但这是一个实现细节。不要依赖它,否则你会后悔的。
小心:你听说过像WannaCry这样的恶意软件吗?还有很多其他人?该恶意软件是通过像您的示例中那样的代码实现的,该代码在您从malloc()
请求的内存范围之外写入。使用malloc()
时,必须确保不会超出这些界限。当你这样做的时候,你并不是偏执狂:国家资助和其他方面的网络犯罪实际上都在密谋反对你。认真地
更好的是,使用具有本机文本字符串和数组数据类型的语言。