-1

这是我的简单程序:

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 [],一切正常。我的代码有什么问题?

4

1 回答 1

16

您忘记了空终止符。

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

在这种情况下,printf似乎有点幸运地很快找到了一个空值,并在打印一些垃圾后正常终止。但是,这种错误通常会使您的程序崩溃并显示消息segmentation fault。当操作系统杀死您的进程时会发生“段错误”,因为它正在执行不应该执行的操作,例如读取不属于它的内存。

试试这个:

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

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

如果您需要一个不想更改的字符串,则应该以这种方式声明它们:

const char* s = "Hello";

这样,您创建了一个指向静态内存的指针,其中包含 string "Hello",不需要复制。

于 2013-05-10T19:13:18.100 回答