2016-02-13 79 views
-1

如果我想在不更改指针地址的情况下更改指向的值,我该怎么办?C,将一个指向的值赋给一个指向的值,比如* a = * b;

3,*d=*b将在运行时返回分段错误。我认为这是因为*d没有指向任何内存空间。这也解释了为什么2,工作。但是,对于1,*a*b指向相同大小的内存,为什么它会在这里返回分段错误?

void main(void){ 
    char *a="abcd"; 
    char *b="1234"; 
    char *c=(char *)malloc(sizeof(char)); 
    char *d; 
    *a=*b; //1.segmentation fault 
    *c=*b; //2.ok 
    *d=*b; //3.segmentation fault 
} 
+3

您不能更改字符串文字。任何尝试修改它们都会导致未定义的行为。此代码无法工作。 –

+2

可能的重复[为什么在写入以“char \ * s”初始化但不是“char s \ [\]”的字符串时出现分段错误?](http://stackoverflow.com/questions/164194/为什么要做,我得到一个分割错误,当写入字符串初始化与cha),http://stackoverflow.com/questions/10202013/change-string-literal-in -c-through-pointer,http://stackoverflow.com/questions/1011455/is-it-possible-to-modify-a-string-of-char-in-c/1011481,http://stackoverflow.com/questions/480555/modify-c-string-constants –

回答

1

这是因为字符串,如"abcd"是C.不变这是不确定的行为,试图修改之一。

如果你希望字符串被修改,你必须声明它是这样的:

char a[] = "abcd"; 

这将宣告一个本地数组与字符串的内容初始化它(这是从声明不同指向字符串的指针)

+0

那么如果我想复制并创建一个新的字符串并使其成为'a'指向呢? – sunjiayang

+0

然后数组方法(上面)不是你应该选择的那个。 –

2

常量字符串通常存储在只读存储器中,您不能修改它们。

为了让他们写的先创建一个副本:

char *a = strdup("abcd"); 
相关问题