【问题标题】:How to properly allocate memory for structs, arrays of structs inside a struct, and passing that array as a parameter如何为结构、结构内的结构数组正确分配内存,并将该数组作为参数传递
【发布时间】:2014-09-12 06:45:26
【问题描述】:

我已经远离 C 语言,当我重新开始研究它时,我发现自己遇到了障碍。我有以下结构:

typedef struct{
      char id;
      struct S *children[SIZE];
}S;

在我的代码中,我最初声明了一个结构数组...

 struct S arr[SIZE];

但是当我尝试将我的第一个孩子分配给我的第一个 arr 成员时......

 arr[0].children[0] = (S*)malloc(sizeof(S));

我收到此警告:警告:内置函数“malloc”的不兼容隐式声明警告:来自不兼容指针类型的赋值[默认启用]

除此之外,我遇到了一个对我来说听起来不太合乎逻辑的错误。我有以下功能:

int foo(S *children[SIZE]);

但是当我拨打这条线时......

foo(arr[0].children);

我收到了这个注释:注释:预期为“struct S **”,但参数的类型为“struct S **” 对我来说这听起来很愚蠢,它期待着它得到的论点并且对此感到不安。

任何帮助解释我应该做些什么来正确分配这个内存并实现相同的想法将非常感激。

【问题讨论】:

  • 结构体中没有结构体数组。你有一个指针数组。这有很大的不同。
  • 在定义类型别名S 之前,在哪里声明结构S?我真的很惊讶你没有得到编译器 errors 因为在结构内部没有名为 S 的结构。

标签: c arrays pointers struct


【解决方案1】:

没有struct S,只有S,这是一个匿名结构的typedef

也定义struct S

typedef struct S {
  char id;
  struct S *children[SIZE];
}S;

或者:

typedef struct S S;
struct S {
  char id;
  S *children[SIZE];
};

还有do avoid casting return of malloc in C:

arr[0].children[0] = malloc(sizeof(S));

【讨论】:

  • 所以当我选择第二个选项时,它现在告诉我它在 ';' 之前期待 '{'并且在“*”标记之前有一个预期的说明符限定符列表
  • 关于结构定义?奇怪的。我没有收到编译器警告。尝试将struct 放回儿童声明。循环类型定义有时会有点麻烦。
  • 好吧,我知道为什么它给了我那个奇怪的东西,当我尝试别的东西时,这是我的错。但是使用第二个选项它不会告诉我错误:“S”被重新声明为不同类型的符号
  • @WarGravy 你还有一些其他代码也定义了S
  • 是的,所以在编译器中,它告诉我我的参考在哪里,它是说 Struct S{...};被定义就行了:typedef struct S S;
【解决方案2】:

对于您的第一个问题,您需要这样做:

#include <stdlib.h>

在程序的顶部,以便成功调用malloc

第二个问题(正如其他人所指出的)是您的类定义中的struct S 指的是与S 不同的结构。在 C 中,结构标签与类型名称位于不同的“命名空间”中。

【讨论】:

  • 谢谢,这很有帮助。我不知道命名空间
猜你喜欢
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2017-03-26
相关资源
最近更新 更多