0

显然 C 不喜欢这样的声明:

char some_array[n] = "Text here"; <== 其中n是一个合适大小的 int ....

好吧,实际上,我猜它喜欢它就好了,但是输出让我感到惊讶!这是一个例子。

    char two[4] = "What";
    printf("2: %s \n", two);

输出是:

2: WhatWhat 

WhatWhat到底在做什么?!

所以我尝试添加:

    char test[4] = "abcd";

输出是:

2: WhatWhatabcd
3: abcd

是的,我明白了,我的语法不受欢迎。但为什么?!实际变量是怎么回事?

4

4 回答 4

3

字符串文字有一个额外的字符 - nul 终止符。

所以你需要让它长度为5:

char two[5] = "What";

或者如果可能的话:

char two[] = "What";

(您遇到缓冲区溢出或其他情况)

于 2013-03-01T05:18:21.477 回答
1

在处理字符串时,您应该考虑空终止符。在这里,您尝试将 4 个字符的字符串文字分配给 4 个字符的数组,从而不为空终止符提供额外的字符空间。

更改代码如下:

char two[5] = "What";
char test[4] = "abcd";

至于为什么"What"你有问题而没有问题,对于这种情况"abcd"行为将是未定义的,因为程序将尝试搜索内存,直到找到空终止符。在你的情况下,它打印不正确,它可能导致崩溃、挂起或天知道是什么。

于 2013-03-01T05:20:51.990 回答
1

字符串仅由 NULL 字符终止,在您的情况下,因为您分配了 4 个字节的空间,并且您在其中存储了正好 4 个字符的“what”,因此没有空间用于 NULL 终止。

在打印时 printf 开始从您提到的起始地址读取数据并一直到 NULL 字符...因此分配缓冲区的相邻内存可能有一些垃圾字符(因为在所有情况下都不会自动刷新内存,当缓冲区被释放时)所以你看到whatwhat或者它可能是whatjkefwhksdjfsdfjsf某天......或者如果它读取到未经授权的内存位置可能是分段错误。

于 2013-03-01T05:21:29.043 回答
1

因为您的最大数组索引是 4,所以您正面临这个问题。

使最大数组索引为 5,例如 char test[5],以便它可以用 NULL 终止字符串。您的问题将得到解决。

于 2013-03-01T05:23:41.750 回答