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

Afs*_*ani -1 c

这是我的简单程序:

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

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

Hellop\370\277_\377

当我改变char s [5]char s [],一切工作正常.我的代码有什么问题?

Col*_*lin 16

你忘了null终止符.

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

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

试试这个:

char s[] = "Hello"; //s is now 6 characters long.
Run Code Online (Sandbox Code Playgroud)

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

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

const char* s = "Hello";
Run Code Online (Sandbox Code Playgroud)

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