不同的字符串初始化会产生不同

Hum*_*art 1 c

为什么我使用以下方法,用于将字符串中的所有字符转换为大写,

while (*postcode) {
    *postcode = toupper(*postcode);

    postcode++;
}
Run Code Online (Sandbox Code Playgroud)

使用以下参数有效,

char wrong[20];
strcpy(wrong, "la1 4yt");
Run Code Online (Sandbox Code Playgroud)

但是,以下,不是,尽管它们是相同的?

char* wrong = "la1 4yt";
Run Code Online (Sandbox Code Playgroud)

我的程序崩溃试图写入非法地址(我认为是一个段错误).这不是问题malloc吗?不是无效的?它应该不是......

通过调试我发现它在尝试将第一个字符分配为大写时崩溃了.

任何帮助赞赏!

Joh*_*ica 5

char* wrong = "la1 4yt";
Run Code Online (Sandbox Code Playgroud)

这声明了一个指向字符串常量的指针.常量无法修改,这就是您的代码崩溃的原因.如果你写的更迂腐

const char* wrong = "la1 4yt"; // Better
Run Code Online (Sandbox Code Playgroud)

然后编译器会抓住错误.您应该在声明指向字符串文字的指针而不是创建数组时执行此操作.

另一方面,这为20个字符分配读/写存储,因此写入空间是好的.

char wrong[20];
Run Code Online (Sandbox Code Playgroud)

如果你想将它初始化为上面的字符串,你可以这样做,然后可以改变它.

char wrong[20] = "la1 4yt"; // Can be modified
char wrong[]   = "la1 4yt"; // Can be modified; only as large as required
Run Code Online (Sandbox Code Playgroud)