3

在我的 GCC 32 位编译器中,以下代码给出了输出

char *str1="United";
printf("%s",str1);

输出:

United

那么我应该考虑char *str1="United";相同char str1[]="United"吗?

4

3 回答 3

2

两者不一样:char *str1="United"给你一个指向文字字符串的指针,它不能被修改(否则它是未定义的行为)。文字字符串的类型实际上应该是 const 但由于历史原因它是非常量的。另一方面,char str1[]="United"为您提供可修改的本地字符串。

于 2013-06-09T03:45:01.423 回答
1

char* str = "United";是只读的。您将无法进入字符串内部并更改其中的部分内容:

*str = 'A';

很可能会给你一个分段错误。

另一方面char str1[] = "United";是一个数组,因此只要不超过为其分配的空间,就可以对其进行修改(无法调整数组的大小)。例如,这是完全合法的:

char str[] = "United";
str[0] = 'A';
printf("%s\n", str);

这将打印Anited.

于 2013-06-09T03:46:47.320 回答
1

请参阅comp.lang.c.faq,问题 1.32。它基本上归结为这样一个事实,即以数组形式 ( char str[] = "foo")声明字符串等同于 ;char str[] = {'f','o','o'}等同于char str[] = {102, 111, 111}; 也就是说,它是堆栈上的普通数组。但是,当您在任何其他上下文中使用字符串文字时,它会变成“一个未命名的静态字符数组,[它] 可能存储在只读内存中,因此不一定可以修改。” (并且尝试修改它会导致未定义的行为,无论它碰巧存储在哪里,所以不要)。

于 2013-06-09T03:50:55.240 回答