在我的GCC 32位编译器中,以下代码给出了输出
char *str1="United";
printf("%s",str1);
输出:
United
那么我应该将char *str1="United";
视为与char str1[]="United"
相同吗?
答案 0 :(得分:2)
两者不一样:char *str1="United"
为您提供了一个指向文字字符串的指针,该字符串不得修改(否则它是未定义的行为)。文字字符串的类型应该是const,但由于历史原因它是非const的。另一方面,char str1[]="United"
为您提供可修改的本地字符串。
答案 1 :(得分:1)
char* str = "United";
是只读的。您将无法到达字符串内部并更改其中的部分内容:
*str = 'A';
很可能会给你一个分段错误。
另一方面,char str1[] = "United";
是一个数组,只要你没有超过为它分配的空间就可以修改它(数组不能调整大小)。例如,这是完全合法的:
char str[] = "United";
str[0] = 'A';
printf("%s\n", str);
这将打印Anited
。
答案 2 :(得分:1)
请参阅comp.lang.c.faq, question 1.32。它基本上归结为这样一个事实,即以数组形式(char str[] = "foo"
)声明字符串与char str[] = {'f','o','o'}
相同,这与char str[] = {102, 111, 111}
相同;也就是说,它是堆栈上的正常数组。但是当你在任何其他上下文中使用字符串文字时,它变成“一个未命名的静态字符数组,[它]可能存储在只读存储器中,因此不一定能被修改。” (并且尝试修改它会导致未定义的行为,无论它发生在哪里,所以不要)。