指针和字符串的基本概念混淆

时间:2013-06-09 03:40:22

标签: c

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

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

输出:

United

那么我应该将char *str1="United";视为与char str1[]="United"相同吗?

3 个答案:

答案 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}相同;也就是说,它是堆栈上的正常数组。但是当你在任何其他上下文中使用字符串文字时,它变成“一个未命名的静态字符数组,[它]可能存储在只读存储器中,因此不一定能被修改。” (并且尝试修改它会导致未定义的行为,无论它发生在哪里,所以不要)。