【问题标题】:String not terminated with null character in C [duplicate]C中的字符串未以空字符结尾[重复]
【发布时间】:2018-03-07 16:42:04
【问题描述】:

请解释以下程序的输出,为什么数组打印到第 10 个数组索引,如果我不以空字符终止字符串,它总是打印数组的大小,然后循环终止,这意味着它现在找到空字符。每次我发现最后的大小相同时,我都会检查不同大小的数组,然后

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

int main()
{
    int i;
    char name[10];

    for(i=0;i<10;i++)
    {
        name[i]='A';
    }
    for(i=0;name[i]!='\0';i++)
    {
        printf("%d %d\n",i,name[i]);
    }
}

OUTPUT is
0 65
1 65
2 65
3 65
4 65
5 65
6 65
7 65
8 65
9 65
10 10

【问题讨论】:

  • 这只是运气。你的代码读取它在内存中发现的任何垃圾,直到它找到一个碰巧在那里的空字节。
  • UB。你只是变得“幸运”(有些人可能会说“不幸”)。内存中的数组后面恰好有一个 0。 Ide 产生不同的结果:ideone.com/nhbS4r
  • 引用 name[10] 会产生未定义的行为,因此任何事情都可能发生。在您的情况下可能发生的情况是 name + 10 寻址堆栈上name 旁边的整数的最低有效字节,恰好是 10。下一个有效字节是 0,通过 name + 11 寻址。
  • 嗨,Rajiska,这可能是运气,但我只是在试验,我发现每次它打印数组的大小然后它终止意味着找到一个空值。
  • 我正在使用 gcc 编译,我知道程序可能已经崩溃,这只是运气,但我感兴趣的是为什么它总是打印数组的大小,然后立即在我拥有的下一个内存块中找到一个空值每次都检查了数百次,无论如何我总是用空值终止我的字符串。谢谢

标签: c string


【解决方案1】:

数组越界访问是未定义的行为。您已超出范围访问数组索引。您获得了未定义的行为。

程序可能在某个随机索引处崩溃、停止或完美运行,或者只是在索引 9 处停止。无法保证会发生什么。建议您不要在代码中引入未定义的行为。不要这样做。 C 不提供对超出范围的数组索引的检查。你必须小心这种情况。

你不能称它为字符串——它是一个字符数组。不是字符串。我们不能说它是字符串,除非它以\0 结尾。

【讨论】:

  • @DavidRTribble.: 并且strlen 等不适用于未终止的字符串。未终止的字符串和字符数组没有区别。并且很可能您已经在字符序列的意义上使用了字符串。我只是按照我们的约定将 nul 终止的 char 数组称为字符串。这就是全部。
【解决方案2】:

您正在读取超出数组末尾的内容,这会导致未定义的行为。

在这种情况下,您会遇到用于存储 i 值的内存,该值可能存储为四个字节 0a 00 00 00(即小端字节序中的数字 10)。

但实际上,当您邀请 UB 时,任何事情都可能发生。所以不要这样做!

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多