【问题标题】:Array of struct within struct (C)结构内的结构数组(C)
【发布时间】:2016-11-22 10:53:00
【问题描述】:

我正在尝试在 C 中的结构中设置一个结构数组。数组的大小直到运行时才知道,所以我尝试将数组定义为动态的。我已将我的问题简化为下面显示的代码(每个结构中还有几个成员,但不构成问题)。

//struct definitions
struct intStream {
int test;
};

struct io {
struct inStream **inputStream;
};

// then proceed to main
int numDevices = 4; //(derived from number of devices found at runtime)
struct io *devices;
devices->inputStream = malloc(sizeof(struct inStream) * numDevices)

// Fails on
devices->inputStream[0]->test = 1;

我对 C 风格的编程还是比较陌生,所以我对内存的理解并不完整,但是通过一些搜索,除了我不喜欢的 struct hack 之外,我无法找到解决我的问题的替代解决方案,因为以及希望将来包含更多数组的选项。

【问题讨论】:

  • 你有一个统一的变量devices。你认为它指向什么?
  • 请不要添加问题的答案,谢谢。 :)
  • @n.m.我已经看到了我的方式的错误;)不太确定我期望回头看!
  • @SouravGhosh 当然,我只是想包含一个“更完整”的答案版本,谢谢。
  • 代码中没有结构数组。在您的结构中也没有 指向结构的指针 的数组。如果需要灵活数组,请使用灵活数组成员

标签: c arrays pointers struct


【解决方案1】:

在此代码中,devices 未初始化。使用未初始化的内存调用undefined behavior

您需要使devices 指向一些有效内存,然后才能取消对该指针的引用。

也就是说,

 devices->inputStream = malloc(sizeof(struct inStream) * numDevices)

看起来也有问题。你可能想要的是

 devices->inputStream = malloc(sizeof(struct inStream *) * numDevices);

然后,您还需要为每个devices->inputStream[i] 分配内存。


[OP修改代码,从问题中删除并添加到答案中,仅供参考]

struct io *devices;
devices = malloc(sizeof(*devices));  

devices->inputStream = malloc(sizeof(struct inStream *) * numDevices);

for(int i = 0; i < 4; i++) {  
    devices->inputStream[i] = malloc(sizeof(struct inStream));  
}

【讨论】:

  • 感谢您的解决方案,您解释的方式非常有意义。我试图在此评论中提供完整的答案,但没有奏效,因此我也用您的建议/解决方案更新了问题。
  • @user2142136 我已经更正并在我的答案中添加了您的代码,希望没关系。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多