这是我的简单程序:
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 []
时,一切正常。我的代码有什么问题?
答案 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"
,无需复制。