【问题标题】:Double Dereference in struct C结构 C 中的双重取消引用
【发布时间】:2017-01-13 02:44:23
【问题描述】:

我有以下代码。看来阅读顺序是错误的。有什么帮助吗?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct punct{
int x;
int y;
}COORD;

typedef struct nod{
COORD *coord;
struct nod *urm;
}NOD;
int main()
{
  NOD *head= malloc( sizeof(NOD) );
  scanf("%d", &head->coord->x );
  scanf("%d", &head->coord->y );
  printf("%d, %d", head->coord->x , head->coord->y);

  return 0;
}

我已经成功地使用head-&gt;coord 成功地访问了结构的 x 字段,据我所知,这就是我的代码的问题。我已经在第一个结构的第一个字段上,因此我无法访问 x/y。

【问题讨论】:

  • 你在哪里初始化head-&gt;coord
  • 尝试一些适当的括号:scanf("%d", &amp;((head-&gt;coord)-&gt;y));
  • @OliverCharlesworth 谢谢,没想到。以为我已经完成了 head 的初始化。
  • @nica.dan.cs 已经做了,没用。
  • @nica.dan.cs:这些括号不会改变评估顺序:它添加了额外的文本,效果没有区别。您可能想查看expression evaluation order

标签: c struct dereference


【解决方案1】:

你没有初始化 coord 变量,所以你也应该为它分配一些空间。

head-&gt;coord = malloc( sizeof (COORD) );

但在这种情况下,最好将 COORD 放在 NOD 中而不是引用它!

所以:

typedef struct nod{
   COORD coord;
   struct nod *urm;
}NOD;

只有当你要经常交换对象或者当它是一个更复杂的对象时,你才应该真正创建一个指向它的指针。

【讨论】:

  • 在这里直接嵌入COORD 似乎是正确的。如果它是 COORD 值的数组,那么您也需要一个计数。
  • @JonathanLeffler 说我想创建一个坐标数组。如何在假设数组 COORD **A = malloc( n * sizeof( COORD* ) ); 之间创建链接,其中 n 是 x,y 对的数量,以及类型 NOD 元素的列表。我正在考虑一个 for until head 为 NULL,其中 head 是我列表的开头,每次迭代我都会做 A[i]-&gt;x= head-&gt;coord-&gt;xA[i]-&gt;y= head-&gt;coord-&gt;y。有什么想法吗?
  • @AlexPostolache:假设结构类似于:typedef struct nod { size_t num_coords; COORD *coord; struct nod *urm; } NOD;,那么您将定义NOD *nod = malloc(sizeof(*nod)); if (nod == 0) { …error…; } nod-&gt;coord = malloc(n * sizeof(*nod-&gt;coord)); if (nod-&gt;coord == 0) { …error…; free(nod); } nod-&gt;num_coords = n; nod-&gt;urm = 0; 或类似的结构。这分配了供结构使用的坐标数组:nod-&gt;coord[0] .. nod-&gt;coord[nod-&gt;num_coords - 1] 是有效引用。
【解决方案2】:

你还没有初始化head-&gt;coord。取消引用未初始化的指针会导致 undefined behaviour。您需要执行以下操作:

  head->coord = malloc( sizeof (COORD) );

您还应该检查malloc() 的返回值是否失败。

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多