c:内存分配(发生了什么)

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)

拜托,任何人都可以发现在分配内存时发生的事情.

Jam*_*lis 7

您分配一个字节,然后超出分配的内存的边界. sprintf没有边界检查(它的朋友,snprintf边界检查).

当您超出分配的内存时,您会得到未定义的行为,因此任何事情都可能发生.在您的情况下,它似乎正常工作.您的程序也可能崩溃,或者其他任何可能发生的事情.

  • 使用不同的优化标志编译并观察会发生什么.Betcha有些不同的事情发生. (2认同)
  • 程序不需要输出任何不同的东西.程序员需要确保正确的事情发生.(在现代计算机的情况下,实际上会分配一个8字节或更大的块,但你不应该依赖它.)如果你想检查你的sprintf的边界,请使用`snprintf(some1,1,)酷");`相反.注意名称中的'n'. (2认同)

Mat*_* B. 7

您正在调用未定义的行为.绝对任何事情都可能发生在这一点上,包括你可能期望的.

实际发生的是系统确实在更大的块中为您分配内存.因此,当您超出程序定义的范围时,就系统而言,您还没有超越缓冲区.几乎所有实现都这样做; 例如,系统跟踪16字节块比在逐字节的基础上更容易跟踪.