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