2012-01-09 97 views
0

程序是:这个小C程序为什么会崩溃?

#include <stdio.h> 
#include <stdlib.h> 
int main(void) { 
    char *a="abc",*ptr; 
    ptr=a; 
    ptr++; 
    *ptr='k'; 
    printf("%c",*ptr); 
    return 0; 
} 

的问题是在

*ptr='k'; 

线,当我删除程序正常工作。但我找不出原因。

+0

对这个问题的一个很好的解释可以在这里找到(http://stackoverflow.com/questions/1011455/is-it-possible-to-modify-a-string-of-char-in-c ) – JediLlama 2012-01-09 05:25:20

回答

6

的问题是,因为你正在试图改变字符串字面​​有:

char *a="abc",*ptr; 
ptr=a;     // ptr points to the 'a'. 
ptr++;     // now it points to the 'b'. 
*ptr='k';    // now you try to change the 'b' to a 'k'. 

这是不确定的行为。该标准明确规定,您不得修改字符串文字作为每节6.4.5 String literals C99的:

这是不确定的这些阵列是否提供了不同的元素都有相应的值。如果程序试图修改这样一个数组,那么行为是不确定的。

工作,如果你更换:

char *a="abc",*ptr; 

有:

char a[]="abc",*ptr; 

因为那份字符串文字到是安全的,修改的地方。

0

因为“abc”是一个常量字符串文字。然后你指向ptr并尝试修改它是未定义的行为。通常将字符串文字放在内存部分,该部分被映射为只读 - 因此是访问冲突。

也看到这个问题:String literals: Where do they go?

0

的原因是,你的字符串​​生活的记忆只读区域。它被链接器放到那里。您尝试在程序中更改它,并且所有投注都关闭。

+1

更正:它在内存中,可能是也可能不是只读的。完全可以运行完成并打印出修改过的字符串。另一种可能性是它将修改具有相同值的另一个字符串文字。例如:'int main(){char * s =“abc”; s [1] ='d';的printf( “ABC”); }'可能会打印出'adc'。 – 2012-01-09 05:17:05

+0

在OP的情况下,这绝对是因为只读内存。但是,的确,我已经看到了你之前指出的(在PlayStation1上)..如果我们打算改变其中的一个,我们必须故意让我们的字符串不同。 (娱乐时间。) – 2012-01-09 05:42:41

0

此:

char *a="abc"; 

是真的:

const char *a="abc"; 

您不能修改ptr,它指向相同的地址a