C,为尖头值指定一个尖头值,如* a = * b;

时间:2016-02-13 13:35:23

标签: c pointers variable-assignment

如果我想在不改变指针地址的情况下更改指向值,我该怎么办?

在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
}

2 个答案:

答案 0 :(得分:2)

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

要使它们可写,请先创建一个副本:

char *a = strdup("abcd");

答案 1 :(得分:1)

这是因为"abcd"等字符串在C中是常量。尝试修改字符串是未定义的行为。

如果你想让字符串可以修改,你必须这样声明:

char a[] = "abcd";

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