程序是:这个小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';
线,当我删除程序正常工作。但我找不出原因。
程序是:这个小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';
线,当我删除程序正常工作。但我找不出原因。
的问题是,因为你正在试图改变字符串字面有:
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;
因为那份字符串文字到是安全的,修改的地方。
因为“abc”是一个常量字符串文字。然后你指向ptr
并尝试修改它是未定义的行为。通常将字符串文字放在内存部分,该部分被映射为只读 - 因此是访问冲突。
的原因是,你的字符串生活的记忆只读区域。它被链接器放到那里。您尝试在程序中更改它,并且所有投注都关闭。
更正:它在内存中,可能是也可能不是只读的。完全可以运行完成并打印出修改过的字符串。另一种可能性是它将修改具有相同值的另一个字符串文字。例如:'int main(){char * s =“abc”; s [1] ='d';的printf( “ABC”); }'可能会打印出'adc'。 – 2012-01-09 05:17:05
在OP的情况下,这绝对是因为只读内存。但是,的确,我已经看到了你之前指出的(在PlayStation1上)..如果我们打算改变其中的一个,我们必须故意让我们的字符串不同。 (娱乐时间。) – 2012-01-09 05:42:41
此:
char *a="abc";
是真的:
const char *a="abc";
您不能修改ptr
,它指向相同的地址a
。
对这个问题的一个很好的解释可以在这里找到(http://stackoverflow.com/questions/1011455/is-it-possible-to-modify-a-string-of-char-in-c ) – JediLlama 2012-01-09 05:25:20