【问题标题】:how to dereference index of pointer array of structures within a structure如何取消引用结构中结构的指针数组的索引
【发布时间】:2014-09-21 04:51:18
【问题描述】:

我有全局结构:

typedef struct node{
    int numOfOccur; 
    struct node *children; 
}Node;
Node *root;

然后在我正在做的另一种方法中:

root.numOfOccur = 0;
root.children = (Node *)calloc(27, sizeof(struct node));
Node* temp = &root;

然后我尝试在 while 循环中检查子数组的某个索引是否为 NULL。 我正在尝试通过以下方式获取价值

(temp->children)[c]

它说 如果标量类型('struct node' 无效),语句需要表达式 我尝试了以下所有方法:

temp -> children[c]
(*temp).children[c]

但两者都不起作用..

下面的代码效果不好..它说“间接需要指针操作数('struct node'无效)。

*(*temp).children[c] 

【问题讨论】:

  • 请注意(temp->children)[c] 不起作用,因为children 不是数组而是指针,因此您可以访问numOfOccurchildren,这是该结构的所有成员。
  • @Jack 好吧,据我所知,您可以使用括号表示法来访问指针数组的索引..
  • 你可以从: Node *root;只产生一个指针。你还需要它指向的东西,比如 Node *root = malloc( sizeof( Node ) );代码中还有一些其他问题,但这是第一个执行错误行。

标签: c pointers


【解决方案1】:

我认为您的代码示例一定有点不对劲。它必须是“节点根;”否则下面的代码都会失败:

root.numOfOccur = 0;
root.children = (Node *)calloc(27, sizeof(struct node));
Node* temp = &root;

我将假设是这种情况,因为您正在询问有关遵循上述逻辑的代码的问题。如果该假设是正确的,那么您的问题是 calloc(27,sizeof()) 分配了一个包含 27 个 Node 对象的内存块并将它们清零。您说明的每个表达式都是相等的:

(temp->children)[c]
temp->children[c]
(*temp).children[c]

每个都引用数组中的 Node 对象,而不是 Node*,因此您无法检查它们是否为 null。

没有堆分配,你有相当于:

Node children[27];

这是一个包含 27 个 Node 对象的内存块。您可以通过以下方式访问它们:

children[c].numOfOccurs=0;

确保不要使用大于 26 的索引。

在查找空指针时,您将其视为原样:

Node *children[27];

这是一个包含 27 个节点* 的列表。在这种情况下,假设它们最初被清零,您可以在列表中搜索一个空指针并分配一个新的 Node* 并分配它,只要您没有遍历 children[26]。

【讨论】:

  • 感谢您的详细解释。但是,仍然,如果我这样做 *(*temp).children[c] 它不起作用..它说“间接需要指针操作数('struct node'无效)。我应该如何编写它来检查空值?
  • children[c] 是 Node 结构,不是指向 Node 结构的指针,所以不能为 null。添加新节点时会做什么?让孩子们指向某物?如果是这样,您可以检查 children[c].children != NULL。
  • 据我了解 struct node *children 是一个 struct node 类型的指针数组...不是吗?当我使用 calloc 时,它只是将 27 个指针设置为 NULL。没有??
  • 没有。 struct node children 是一个结构节点数组,而不是指向结构节点的指针。 calloc() 分配 27 个实际结构并将它们清零。 children[idx] 是结构节点,而不是结构节点。要获得指针列表,您需要 struct node *children 和 calloc(27,struct node)
猜你喜欢
  • 2014-05-25
  • 2011-02-04
  • 2013-01-16
  • 2013-01-04
  • 1970-01-01
  • 2021-11-23
  • 2017-06-17
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多