当缓冲区很小以容纳某些数据时会发生什么

时间:2014-02-23 08:32:58

标签: c

我的问题是为什么以下代码段不会崩溃?

int main(int argc, const char * argv[])
{
    const char* source = "SomeText";
    char* dest = (char*)malloc(sizeof(char)); // isn't this wrong ?

    strcpy(dest, source);

    printf("%s\n", dest);

    free(dest);


    return 0;
}

4 个答案:

答案 0 :(得分:2)

当缓冲区太小而无法容纳正在复制的字符串时,

strcpy将超出缓冲区。这将导致未定义的行为甚至程序崩溃(segfault),因为strcpy将尝试写入未分配给缓冲区的内存。你不能依赖发生的事情。下次运行程序时,它可能会崩溃。以下是我建议的一些修复方法。

// in main

const char *source = "SomeText";
char *dest = malloc(strlen(source) + 1); // +1 for the null byte at the end
if(dest != NULL) { // check for NULL
    strcpy(dest, source);
    printf("%s\n", dest);
    free(dest);
}
else {
    printf("not enough memory\n");
} 

strlen不计算字符串中的空字节,因此您必须为strcpy字符串中的source分配一个额外字节。您应该检查malloc的结果为null。此外,您不应该投射malloc的结果。没有任何好处,如果您忘记包含stdlib.h头文件,它可能会导致错误。

答案 1 :(得分:1)

因为它是未定义的行为并且可能会发生工作。写入未分配的空间是一项风险操作,无法保证成功。

答案 2 :(得分:1)

在这种情况下的行为是未定义的。实际上,保留位置之外的内存将被覆盖。这个记忆可以包含一些重要信息。它可以映射到进程的地址空间中。如果未映射,则会发生系统错误。如果它被映射,那么最可能这个内存包含正确工作malloc和free所需的值,所以你可能会期望在下一个malloc或free上崩溃。如果覆盖大部分内存,可以写入其他动态分配的缓冲区。

在您的情况下,您只覆盖保留位置外的8个字节。最可能的是,这8个字节被映射到地址空间并且根本不使用。这就是为什么没有发生。确切的行为取决于malloc和free的特定实现..

答案 3 :(得分:1)

运气?

但通常malloc会抓取便于操作系统的内存。所以也许它是1K