写出比malloced更多的字符.为什么不失败?

Jon*_*ger 2 c memory-management memory-alignment segmentation-fault strcat

为什么以下工作并没有抛出某种分段错误?

char *path = "/usr/bin/";
char *random = "012";

// path + random + \0
// so its malloc(13), but I get 16 bytes due to memory alignment (im on 32bit)
newPath = (char *) malloc(strlen(path) + strlen(random) + 1);

strcat(newPath, path);
strcat(newPath, "random");
// newPath is now: "/usr/bin/012\0" which makes 13 characters.
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加

strcat(newPath, "RANDOMBUNNIES");
Run Code Online (Sandbox Code Playgroud)

不应该这个调用失败,因为strcat使用的内存多于分配的内存?因此,不应该

free(newPath)
Run Code Online (Sandbox Code Playgroud)

也失败,因为它试图释放16个字节,但我使用了26个字节("/ usr/bin/012RANDOMBUNNIES\0")?

非常感谢你提前!

fvu*_*fvu 7

大多数情况下,这种超限问题并不会使你的程序在烟雾和硫磺燃烧的气味中爆炸.它更加微妙:在超限变量之后分配的变量将被更改,从而导致程序无法解释且看似随机的行为.

  • 如果内存超出_did_会导致程序爆炸,那将是非常棒的 - 想想找到它们是多么容易!当你可以分配_n_个字节并写入_n_ + 1个字节并且在100个中看不到99次不良影响时,很难找到问题所在. (4认同)