在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]
来实现预期效果。