一些简单的指针问题

时间:2013-07-12 00:01:55

标签: c pointers

嗨,请向我解释为什么代码会产生错误,

#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

2 个答案:

答案 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 ***