在C中使用双引用更改字符数组

在C中使用双引用更改字符数组,c,pointers,C,Pointers,为什么会这样 char** p; char* s = (char*)malloc(6); strcpy(s,"abcde"); s[2] = 'f'; printf("%s",s); *p = s; p[0][2] = 'g'; printf("\n%s",*p); 输出: abfde abgde abfde abfde 但事实并非如此 char** p; char* s = (char*)malloc(6); strcpy(s,"abcde"); s[2] = 'f'; printf("

为什么会这样

char** p;
char* s = (char*)malloc(6);
strcpy(s,"abcde");
s[2] = 'f';
printf("%s",s);
*p = s;
p[0][2] = 'g';
printf("\n%s",*p);
输出:

abfde
abgde
abfde
abfde
但事实并非如此

char** p;
char* s = (char*)malloc(6);
strcpy(s,"abcde");
s[2] = 'f';
printf("%s",s);
*p = s;
*p[2] = 'g';
printf("\n%s",*p);
输出:

abfde
abgde
abfde
abfde

为什么在第一种情况下(p[0][2])使用索引访问位置有效,但不使用引用(*p[2])?

第一个代码具有未定义的行为,
p
*p=s时未初始化发生。因此,它不“工作”;任何事情都有可能发生


也就是说,查看运算符优先级规则。

第一个代码具有未定义的行为,
p
*p=s时未初始化发生。因此,它不“工作”;任何事情都有可能发生


也就是说,请查看运算符优先级规则。

只是添加到前面的注释中

而不是:

*p = s;
执行此操作以正确初始化
p

p = &s;
最后,只需使用括号即可获得与
p[0][2]
相同的效果:

(*p)[2] = 'g';

只是补充了前面的评论

而不是:

*p = s;
执行此操作以正确初始化
p

p = &s;
最后,只需使用括号即可获得与
p[0][2]
相同的效果:

(*p)[2] = 'g';

给定发布的代码,
p
*p=s解除引用时指向什么?首先,您正在通过未初始化的指针
p
进行写入。在分配给
*p
之前,您需要将其初始化为指向有效的
字符*
。其次,
*p[2]
分组为
*(p[2])
,相当于
p[2][0]
。您可以使用
(*p)[2]
来达到预期效果。给定发布的代码,当您将其与
*p=s解除引用时,
p
指向什么?首先,您正在通过未初始化的指针
p
进行写入。在分配给
*p
之前,您需要将其初始化为指向有效的
字符*
。其次,
*p[2]
分组为
*(p[2])
,相当于
p[2][0]
。您可以使用
(*p)[2]
来实现预期效果。