我只是学习C而且我有这个代码,它在C中定义了两个结构:
typedef struct {
int id;
char *name;
} Object;
typedef struct {
unsigned size;
Object *items;
} Array;
我不确定那里会发生什么,我该如何处理这些结构
是真的,那个结构数组包含结构数组Object?如果是这样,怎么样?我在这里看不到任何方括号
有人能解释一下里面发生了什么吗?关于指针不确定。
我怎样才能初始化结构Array,它将包含大量的结构Object取决于大小?
我必须使用malloc或realloc吗?如果我在函数中使用alloc,我怎么能在以后释放它,如果我不知道,我调用了包含malloc的函数多少次?
由于
答案 0 :(得分:1)
"是不是,结构数组包含结构数组Object?"
不,它不是。结构数组包含指针,而不是数组。要创建arry,您必须使用malloc
或calloc
分配内存,然后将其分配给此指针。
"如果我在功能中使用alloc,我怎么能在以后释放它,如果我不知道,我有多少次调用包含malloc的函数?"
有free( void* ptr )
来清除您使用malloc
或calloc
分配的内存。看看这里例如 - 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
类型,因此您可以设置id
和name
成员,如下所示:
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
。