这是我的简单程序:
int main(int argc, const char * argv[])
{
char s [5] = "Hello";
printf("%s", s);
return 0;
}
Hello
是 5 个字符的长度,所以我定义了 achar s [5]
但输出是:
你好\370\277_\377
当我更改为char s [5]
时char s []
,一切正常。我的代码有什么问题?
这是我的简单程序:
int main(int argc, const char * argv[])
{
char s [5] = "Hello";
printf("%s", s);
return 0;
}
Hello
是 5 个字符的长度,所以我定义了 achar s [5]
但输出是:
你好\370\277_\377
当我更改为char s [5]
时char s []
,一切正常。我的代码有什么问题?
您忘记了空终止符。
C 字符串的末尾应该有一个\0
字节来标记字符串的结尾。您的输出看起来很奇怪的原因是printf
,在寻找空终止符时,已经进入未初始化的内存,这会触发未定义的行为。
在这种情况下,printf
似乎有点幸运地很快找到了一个空值,并在打印一些垃圾后正常终止。但是,这种错误通常会使您的程序崩溃并显示消息segmentation fault
。当操作系统杀死您的进程时会发生“段错误”,因为它正在执行不应该执行的操作,例如读取不属于它的内存。
试试这个:
char s[] = "Hello"; //s is now 6 characters long.
通过不提供数字,编译器决定您的数组需要多大并将"Hello"
数据复制到其中。
如果您需要一个不想更改的字符串,则应该以这种方式声明它们:
const char* s = "Hello";
这样,您创建了一个指向静态内存的指针,其中包含 string "Hello"
,不需要复制。