【问题标题】:Pointer to array of structures - explanation指向结构数组的指针 - 解释
【发布时间】:2023-03-21 07:56:02
【问题描述】:

我刚学C,我有这段代码,它在C中定义了两个结构:

typedef struct {
  int id;
  char *name;
} Object;

typedef struct {
  unsigned size;
  Object *items;
} Array;

我不确定那里会发生什么以及如何使用这些结构。
是真的,结构数组包含结构对象数组吗?如果是这样,怎么做?我在这里看不到任何方括号。
有人可以解释里面发生了什么吗?不确定指针。 例如,我如何初始化结构数组,它将根据大小包含结构对象的数量?
我必须使用 malloc 或 realloc 吗?如果我在函数中使用alloc,以后如何释放它,如果我不知道,我调用了多少次包含malloc的函数?

谢谢

【问题讨论】:

    标签: c arrays pointers structure


    【解决方案1】:

    “是真的,结构数组包含结构数组对象吗?” 不,不是。结构数组包含一个指针,而不是一个数组。要创建数组,您必须使用 malloccalloc 分配内存,然后将其分配给此指针。

    “如果我在函数中使用alloc,以后怎么释放它,如果我不知道,我调用了多少次包含malloc的那个函数?” 有free( void* ptr ) 来清理你用malloccalloc 分配的内存。看看这里例如 - http://www.cplusplus.com/reference/cstdlib/free/

    如果你想在里面有一个数组,你必须有这样的东西

    typedef struct {
      unsigned size;
      Object items[10];
    } Array;
    

    【讨论】:

      【解决方案2】:

      Array 包含一个指向Object指针,可用于指向动态分配的数组,如下所示:

      Array arr;
      arr.size = 10;
      arr.items = malloc( sizeof *arr.items * arr.size );
      

      每个arr.items[i] 都有Object 类型,因此您可以像这样设置idname 成员:

      arr.items[i].id = 1;
      arr.items[i].name = malloc( strlen( "foo" ) + 1 );
      if ( arr.items[i].name )
        strcpy( arr.items[i].name, "foo" );
      

      完成后,您需要确保在释放 arr.items 之前释放每个 arr.items[i].name

      for ( size_t i = 0; i < arr.size; i++ )
      {
        free( arr.items[i].name ); // assumes memory for arr.items[i].name was
      }                            // allocated with malloc, calloc, or realloc
      free( arr.items );
      

      如果arr.items[i].name被设置为指向一个字符串字面量或者一个auto数组,比如

      arr.items[i].name = "foo";
      ...
      char some_array[] = "bar";
      arr.items[j].name = some_array;
      

      那么您将想在这些项目上调用free

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-03
        • 2012-12-07
        • 2016-06-20
        • 1970-01-01
        相关资源
        最近更新 更多