【问题标题】:Is this End of Transmission character or something else?这是传输结束字符还是其他?
【发布时间】:2015-09-16 22:48:51
【问题描述】:

所以我正在用标准 C 编写字符串基础教程。

我有:

char mystring[] = "HAL";
for (int i = 0; i < 3; i++) 
    mystring[i] += 1;
for (int k = 0; k < 10; k++)
    printf("\n %d", mystring[k]);

哪个输出:

73
66
77
0
4
0
0
0
0
0

现在 mystring[3] = 0 对我来说很有意义,因为我读到字符串文字以空字符结尾,所以字节数是 n+1 个字符。我不知道为什么 mystring[4] = 4 虽然。我在 ascii 表中查找了 4,它说它是“传输结束”。我在 C 字符串的传输字符结束时做了一些快速的谷歌搜索,但没有找到任何东西。那么有人能告诉我这里发生了什么吗?这是一个标准的东西吗?我可以期待它在什么时候发生?

【问题讨论】:

    标签: c arrays ascii


    【解决方案1】:

    您正在访问内存超出范围。你真的不知道里面有什么。从您找到的 40Thunder Cata demon may come out of your nose,可能有任何东西。

    根据C Standard的定义,访问越界内存是Undefined Behavior


    您可能会感兴趣

    【讨论】:

      【解决方案2】:

      超出数组边界的访问是未定义的行为

      【讨论】:

      • 啊废话我一直忘记这个,谢谢。当它允许我时,我会给你分数,因为你是第一个。也感谢其他回答者,感谢您的意见。
      【解决方案3】:

      一旦超过第一个 \0,C 就不会定义缓冲区的内容。基本上,您得到了上次使用该内存区域时留在内存中的任何内容,并且在您的上下文中没有任何意义。

      【讨论】:

        【解决方案4】:

        这一行分配了 4 个字节的内存。下面数组中的 3 个加上看不见的字符串终止符 '\0'

        char mystring[] = "HAL";
        

        数组索引来自0,所以mystring[2]'L'mystring[3]'\0'

        进一步索引是未定义的行为,因此没有人可以解释您得到的值4

        【讨论】:

        • '\0' 也在数组中。
        • @zenith 谢谢我以为我已经说清楚了,但我加了一个词。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-22
        • 2011-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-11
        相关资源
        最近更新 更多