嗨,请向我解释为什么代码会产生错误,
#include<stdio.h>
int main(){
char ***x;
char **q = *x;
char **(*c) = x;
char ***d = &q;
char ***p = "asdasd";
x=p;
printf("d:%s\n",d);
printf("q:%s\n",q);
printf("x:%s\n",x);
return 0;
}
输出: 1 分段错误
嗨感谢您的回复,所以如果我初始化x,我仍然会在
上遇到分段错误printf("q:%s\n",q);
输出和代码如下所示,请告知为什么d:1231而不是1231123124以及为什么x = p只改变x的值而不是全部(x,q,d)
int main(){
char ***x = "1231123124";
char **q = *x;
char **(*c) = x;
char ***d = &q;
char ***p = "asdasd";
x=p;
printf("p:%s\n",p);
printf("d:%s\n",d);
// printf("q:%s\n",q);
printf("x:%s\n",x);
printf("c:%s\n",c);
return 0;
}
输出: p:asdasd
d:1231
X:asdasd
C:1231123124
答案 0 :(得分:2)
char **q = *x;
在这里你取消引用一个未初始化的指针。
这是未定义的行为,在这种情况下,它通常会导致段错误(实际上,您的代码将尝试取消引用一些随机内存位置,如果编译器初始化局部变量,则为NULL(这是调试/非优化构建的典型情况))
答案 1 :(得分:1)
这些是类型错误。
printf("d:%s\n",d); // d is char***, not char*
printf("q:%s\n",q); // q is char**, not char*
printf("x:%s\n",x); // x is char***, not char*
%s
说明符需要char *
参数,或者可能是void *
,const char *
等,但绝不是char **
或char ***