指向结构数组的指针 - 解释

时间:2015-12-01 13:02:30

标签: c arrays pointers structure

我只是学习C而且我有这个代码,它在C中定义了两个结构:

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

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

我不确定那里会发生什么,我该如何处理这些结构 是真的,那个结构数组包含结构数组Object?如果是这样,怎么样?我在这里看不到任何方括号 有人能解释一下里面发生了什么吗?关于指针不确定。 我怎样才能初始化结构Array,它将包含大量的结构Object取决于大小?
我必须使用malloc或realloc吗?如果我在函数中使用alloc,我怎么能在以后释放它,如果我不知道,我调用了包含malloc的函数多少次?

由于

2 个答案:

答案 0 :(得分:1)

"是不是,结构数组包含结构数组Object?" 不,它不是。结构数组包含指针,而不是数组。要创建arry,您必须使用malloccalloc分配内存,然后将其分配给此指针。

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

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

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

答案 1 :(得分:0)

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[i].name之前释放每个arr.items

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