C中与位置相关的指针
我正在学习C的一些指针。这里有一个作业,我认为老师给出的答案是错误的: 因此,问题是在第2点,与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
*(*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
}