c-Malloc(1)正在分配5个字节


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()时,必须确保不会超出这些界限。当你这样做的时候,你并不是偏执狂:国家资助和其他方面的网络犯罪实际上都在密谋反对你。认真地

更好的是,使用具有本机文本字符串和数组数据类型的语言。

相关内容

  • 没有找到相关文章

最新更新