C中与位置相关的指针

C中与位置相关的指针,c,pointers,C,Pointers,我正在学习C的一些指针。这里有一个作业,我认为老师给出的答案是错误的: 因此,问题是在第2点,与*(*p1.next)相关的位置是什么。我得到的答案是m7.2。 我认为这是与*(p1)相关联的位置。下一个不是他要问的位置。我想在第二点 *((*p1).next)仍然没有定义。正如其他人所说,不要这样编写代码。甚至不是为了演示 可以使用->访问指向结构的指针的成员(*p1)。a是一种迟钝的书写方式p1->a*(*p1.next)是一种迟钝的书写方式*(p1->next) 在点2,p1->nex

我正在学习C的一些指针。这里有一个作业,我认为老师给出的答案是错误的:

因此,问题是在第2点,与
*(*p1.next)
相关的位置是什么。我得到的答案是m7.2。 我认为这是与
*(p1)相关联的位置。下一个
不是他要问的位置。我想在第二点

*((*p1).next)
仍然没有定义。

正如其他人所说,不要这样编写代码。甚至不是为了演示

可以使用
->
访问指向结构的指针的成员<代码>(*p1)。a
是一种迟钝的书写方式
p1->a
*(*p1.next)
是一种迟钝的书写方式
*(p1->next)



在点2,
p1->next
指向尚未初始化的m7.2。它将包含垃圾。用
*(p1->next)
解除对它的引用是。

当您学习C时,我将在这里指出一些问题:

  • 在C中,我们不强制转换malloc的结果。主要原因是:它可能会抑制未包含stdlib的警告id,并且int size小于指针大小。这是一个相当历史性的问题(现代编译器会警告丢失原型),但它仍然被认为是一种不好的做法

  • 如果可以使用对象,请不要在typedefs中使用类型<代码>结构T*p1=malloc(sizeof(*p1))是一种正确的方法。使用类型被认为是不好的做法

  • 当取消引用指向结构或联合的指针时,使用
    ->
    运算符而不是
    (*)。
    。它更容易让人阅读,并立即显示我们通过指针访问
    struct
    union
    的成员


  • 回答您的主要问题:由于
    p1->next
    从未初始化,(分配)它包含不确定的值。这种指针称为“野生指针”。您不应该取消引用野生指针,因为它可能会导致未定义的行为。

    p1->next
    (这是更正确的取消引用此指针的方法)在第二点从未分配,也无法确定。您是否有任何理由不发布源代码而不是某个模糊的图像?这不仅仅是SO的规则;几乎不适合将文本粘贴为图像,尤其是程序文本。@DanielWalker更改对象类型时容易出错。如果使用对象的sizeof,则无需更改任何内容。搜索,所以我在我的一个答案中详细解释了它。将代码作为文本发布,而不是图片。更有用,更容易帮助。你也错了。没有
    *p1.next
    ,它与
    (*p1)完全不同。next
    甚至不用于演示目的。
    尤其是感谢您,这是否意味着不初始化,p1->next就指向它自己的位置?@IsaacP.Liu否,m7.2包含当
    malloc
    抓取它时该内存位置中的任何内容。使用
    p1->next
    就像使用别人的白板而不先擦除它一样
    p1->next=NULL
    会将m7.2初始化为
    NULL
    @IsaacP.Liu它确实指向某个地方,但该位置未定义。没有人能说出这个指针包含什么。
    struct T {
        int *a;
        struct T* next;
    };
    int *y;
    int **z;
    struct T   x;
    struct T*  p1;
    struct T*  p2;
    struct T** p3;
    
    int main()
    {  p1 = (struct T*) malloc(sizeof(struct T));
       p2 = &x ;
       y = (int *) malloc(sizeof(int));
       { int* a[3];
         a[1] = (int *) malloc(sizeof(int));
         z = &a[1];        
         x.a  = *z;                     // point 1
         (*p1).a = *z;                  // point 2
       }             
       (*p1).next = p1;                 // point 3
       p2 = p1;                         // point 4
       p3 = &p1;                        // point 5
       p3 = *(&p3) ;                    // point 6
       p3 = &(*p3) ;                    // point 7
       x.a = y ;                        // point 8
       z = x.a ;                        // point 9
       free(x.a)                        // point 10
    }