【问题标题】:Passing an Array of Structures传递结构数组
【发布时间】:2015-02-17 00:31:03
【问题描述】:

如何传递结构数组?

到目前为止,我有这个是全球性的:

typedef struct _line
{
  float val1;
  int val2;
} line;

然后我从文件中读取数据到这个结构中

struct _line* read_file()
{
  typedef struct _line *Lines
  Lines *array = malloc(num_lines * sizeof(Lines));
  //read values into structures here

然后我用值填充数组中的结构。如果我这样做printf("%d", (*array[1]).val1);,我会在这个特定的方法中得到正确的值

然后我像这样返回数组

return *array

但是当我这样做时,只有第 0 个结构在我返回的方法中正确读取。读取第一个元素只会打印随机值。我做错了什么?

【问题讨论】:

  • 按照您的(很少)代码和描述,您甚至应该无法编译代码。请创建一个Minimal, Complete, and Verifiable Example 并向我们展示。
  • 此外,当您使用 malloc 分配内存时,内容是 indeterminate 直到您初始化它,并且根据您的模糊描述,您不会初始化您分配的所有内存.还有一个问题是你分配sizeof(Lines)的倍数,但是sizeof(Lines)给你指针的大小而不是结构,你想要sizeof(*array)代替(这里的教训:不要' t 使用指针的类型别名)。
  • 停止使用指针类型定义。您的 malloc 错误。

标签: c arrays structure


【解决方案1】:

返回数组时不要取消引用1,它实际上是与函数返回类型不兼容的类型,只是

return array;

另外,在读取值之前检查malloc() 之后的array != NULL,您实际上并不需要typedef,这会使您的代码有点混乱。

如果我怀疑您的代码已编译,那么您的编译器命令中没有启用警告,请启用它们以防止此类问题。


(1) *array 等价于array[0]

【讨论】:

    【解决方案2】:

    扩展我的 cmets,您的代码(正如您描述和展示的那样)您有 undefined behavior

    这是因为您分配了一个指针数组,但您显然没有在该数组中分配指针。因此,当您取消引用一个指针(您尚未分配并且其值是不确定的,因此将指向一个看似随机的位置)时,您会遇到这种未定义的行为。

    不要使用像Line这样的类型别名,而是使用结构名称,比如

    struct _line *array = malloc(num_lines * sizeof(*array));
    

    这将分配num_lines 结构(而不是指针),然后您可以像使用普通数组一样使用它,而无需取消引用指针

    array[x].val1 = something;
    

    你当然会按原样返回那个指针array

    return array;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多