【问题标题】:Why char s [5] doesn't collect value correctly?为什么 char s [5] 不能正确收集值?
【发布时间】:2013-05-10 19:11:43
【问题描述】:

这是我的简单程序:

int main(int argc, const char * argv[])
{
    char s [5] = "Hello";
    printf("%s", s);
    return 0;
}

Hello 是 5 个字符的长度,所以我定义了一个 char s [5] 但输出是:

你好\370\277_\377

当我将char s [5] 更改为char s [] 时,一切正常。我的代码有什么问题?

【问题讨论】:

  • 你忘记了 0 终止符的位置,"Hello" 需要 6 个字节。

标签: c


【解决方案1】:

您忘记了空终止符。

C 字符串的末尾应该有一个\0 字节来标记字符串的结尾。您的输出看起来很奇怪的原因是,寻找空终止符的printf 已经进入未初始化的内存,这会触发未定义的行为。

在这种情况下,printf 似乎有点幸运地很快找到了一个空值,并在打印一些垃圾后正常终止。但是,这种错误通常会使您的程序崩溃并显示消息segmentation fault。当操作系统杀死您的进程时会发生“段错误”,因为它正在执行不应该执行的操作,例如读取不属于它的内存。

试试这个:

char s[] = "Hello"; //s is now 6 characters long.

通过不提供数字,编译器决定您的数组需要多大,并将"Hello" 数据复制到其中。

如果你需要一个不想改变的字符串,你应该这样声明它们:

const char* s = "Hello";

这样,您创建了一个指向静态内存的指针,其中包含字符串"Hello",无需复制。

【讨论】:

  • 对不起,我是 C 新手。不知道!谢谢:)
  • 无需使用此答案末尾显示的声明,使 s 成为指向 const char 的指针。数组很好。如果它明显没有被修改,或者如果声明被更改为const char s[] = …,那么编译器应该将它放在与文本字符串相同的只读段中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多