为什么char [5]没有正确收集价值?

时间:2013-05-10 19:11:43

标签: c

这是我的简单程序:

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

Hello长度为5个字符,因此我定义了char s [5],但输出为:

  

Hellop \ 370 \ 277_ \ 377

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

1 个答案:

答案 0 :(得分:16)

你忘记了空终止符。

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

在这种情况下,printf似乎很幸运地很快就找到了一个null,并在打印一些垃圾后正常终止。但是,这种错误通常会使邮件segmentation fault崩溃。当操作系统杀死你的进程时会发生“seg fault”,因为它正在做一些它不应该做的事情,比如读取不属于它的内存。

请改为尝试:

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

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

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

const char* s = "Hello";

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