2012-02-19 84 views
3

为什么这段代码不起作用?字符指针

int main(){ 
    char *str ="abcde"; 
    scanf("%s",str); 
    printf("%s",str); 
} 

但这个工程?

int main(){ 
    char str[] ="abcde"; 
    scanf("%s",str); 
    printf("%s",str); 
}` 
+1

这个问题是由[SOFAQ条目]回答(http://loungecpp.wikidot.com/faq#stringliterals) – 2012-02-19 01:20:03

回答

5

在第一个代码,你声明的指针,它指向一个string literal"abcde"
这可能是一个常数,你将无法改变它。

第二个代码是声明一个数组并填入['a','b',c','d','e','\0'],它不是一个常量 - 所以你可以改变它。

+0

可以为STR []的情况下输入的时间比大小多个值与它初始化(在这种情况下为6)。 – code4fun 2012-02-19 00:38:10

+0

@gaurav:我不明白[评论]中的问题,你能澄清一下吗? – amit 2012-02-19 00:39:28

+0

我想他是问阵列大小是否可以输入超过6个字符。答案是肯定的,你必须仔细检查。 – Timeout 2012-02-19 00:41:21

4

因为char *str ="abcde";是一个指向字符串的指针,它最有可能存储在只读存储器中。

char str[] ="abcde";是一个用"abcde"初始化的数组。

还应该检查出Difference between char* and char[]

+1

字符串文字不是'const'。他们只是(可能)以只读方式。 – asaelr 2012-02-19 00:48:05

+0

*“一个普通的字符串常量的类型是”n const char数组“和静态存储持续时间。”* – LihO 2012-02-19 00:59:08

+2

这是C++标准。我们正在谈论C.参见http://stackoverflow.com/a/2245983/1055952 – asaelr 2012-02-19 01:05:39

1

当字符串值被直接分配给一个指针,它是存储在只读块(通常以数据段)一个 ,其中 功能

​​共享

...

char str[] = "GfG"; /* Stored in stack segment like other auto 
variables */ *(str+1) = 'n'; /* No problem: String is now GnG */ 

http://www.geeksforgeeks.org/archives/5328

+0

nice article.thanks :) – code4fun 2012-02-19 01:03:23