fac*_*cha 0 c memory-management
请看一下这段代码.我为第一个变量分配一个字节,为第二个变量分配另一个字节.但是,似乎编译器分配更多(或者我缺少一些东西).程序输出两个字符串,即使它们的长度多于一个字节.
void main() {
char* some1 = malloc(1);
sprintf(some1,"cool");
char* some2 = malloc(1);
sprintf(some2,"face");
printf("%s ",some1);
printf("%s\n",some2);
}
Run Code Online (Sandbox Code Playgroud)
拜托,任何人都可以发现在分配内存时发生的事情.
您分配一个字节,然后超出分配的内存的边界. sprintf没有边界检查(它的朋友,snprintf边界检查).
当您超出分配的内存时,您会得到未定义的行为,因此任何事情都可能发生.在您的情况下,它似乎正常工作.您的程序也可能崩溃,或者其他任何可能发生的事情.
您正在调用未定义的行为.绝对任何事情都可能发生在这一点上,包括你可能期望的.
实际发生的是系统确实在更大的块中为您分配内存.因此,当您超出程序定义的范围时,就系统而言,您还没有超越缓冲区.几乎所有实现都这样做; 例如,系统跟踪16字节块比在逐字节的基础上更容易跟踪.