这是我的简单程序:
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",无需复制.
| 归档时间: |
|
| 查看次数: |
640 次 |
| 最近记录: |