分享
三行代码  ›  专栏  ›  技术社区  ›  Kaiyaha

Printf输出超出数组指定长度的字符

  •  1
  • Kaiyaha  · 技术社区  · 1 周前

    char string_one[8], string_two[8];
    printf("&string_one == %p\n", &string_one);
    printf("&string_two == %p\n", &string_two);
    strcpy(string_one, "Hello!");
    strcpy(string_two, "Long string");
    printf("string_one == %s\n", string_one);
    printf("string_two == %s\n", string_two);
    

    得到了这个输出:

    &string_one == 0x7fff3f871524
    &string_two == 0x7fff3f87151c
    string_one == ing
    string_two == Long string
    

    第二个数组无法容纳整个字符串,它太大了。但是,输出输出输出的是整个字符串。 我猜测了一会儿,得出的结论是 printf() 函数不断从下一个字节输出字符,直到遇到字符串结束符为止 '\0' . 我没有找到任何证据来证实我的思考,所以问题是这些推测是正确的吗?

    2 回复  |  直到 1 周前
        1
  •  3
  •   Vlad from Moscow    1 周前

    来自C标准(5.2.1字符集)

    字符集应由 源字符集或由转义序列组成的 反斜杠\后跟一个或多个字符。 设置为0,称为空字符,应存在于basic中 执行字符集;用于终止字符串。

    和(7.21.6.1 fprintf函数)

    8转换说明符及其含义是:

    s 到字符类型数组的初始元素。273) 字符 从数组写入(但不包括)终止 空字符。

        2
  •  0
  •   bekici    1 周前

    我的编译器(GCC)说:

    警告:将12个字节写入大小为8的区域时,目标溢出[-Wstringop overflow=] strcpy(string_two,“长字符串”);

        3
  •  0
  •   Zan Lynx    1 周前

    你以为你知道吗 gcc -O3 -flto

    $ ./char-array-overlap
    &string_one == 0x7fffc502bef0
    &string_two == 0x7fffc502bef8
    string_one == Hello!
    string_two == Long string
    

    strcpy 完全。