繁体   English   中英

只是出于好奇,为什么这不会造成段错误?

[英]Just curiosity, why does this not cause a seg fault?

因此,据我了解,一个C字符串(例如“ 0123456789”)实际上将占用11个字符的数组,主体为10个字符,而终止为null的一个字符。 如果是这样,那么为什么下面的代码不会引起某种错误?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char ** argv){

    char * my_string = "0123456789";
    /* my string should occupy 11 bytes */

    int my_len = strlen(my_string);
    /* however, strlen should only return 10, 
        because it does not count the null byte */

    char * new_string = malloc(my_len);
    /* allocate memory 10 bytes wide */

    memcpy(new_string, my_string, my_len);
    /* copy the first 10 bytes from my_string to new_string
        new_string should NOT be null terminated if my understanding
        is correct? */

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

    /* Since new_stirng is NOT null terminated it seems like this should
        cause some sort of memory exception.
        WHY DOES THIS NOT CAUSE AN ERROR?

    */

    return 0;
}

由于new_string不是以null结尾的,所以我希望printf永远读下去,直到到达其他应用程序的内存,或者在某个位置随机放置0x00并崩溃或打印出奇怪的东西。 这是怎么回事?

您已经创建了未定义的行为 该行为取决于编译器和平台。 可能会崩溃。 它可以工作。 它可能使您敬酒。 它可能会使您的计算机崩溃,并吸收太阳系。

在您的情况下, new_string[11]处的内存可能已经为0 ,即为'\\0'或终止空字符。

因为它是未定义的行为。 未定义的行为并不意味着段错误,尽管这是一种可能。

在您的情况下,从malloc获得的特定内存块之前(程序)从未使用过,并且在分配时可能由OS初始化为零。 因此,第11个字节可能为零,因此没有错误。 在运行时间更长的程序中,malloc可以返回第11个字节不为0的脏内存块,因此您将在printf语句中遇到问题。 在实践中,如果分配的区域的末尾没有null,则将打印垃圾(直到遇到第一个null)。

(正如其他人所说,行为在形式上是不确定的,我只是在解释您所看到的)。

或在某处随机放置的0x00 ...打印一些奇怪的东西。

这是通常观察到的行为。 实际发生的情况是不确定的。

这是未定义的行为。 在某些情况下,它可能导致崩溃,这取决于我想像的内存布局

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM