我正在重新学习一些C编程,并试图理解为什么在为结构动态分配内存之后为什么不能从结构(结构)中打印数据项。
我尝试在结构中打印数据项以查看获得了什么值,但是我的代码没有编译,并且出现错误。
#include <stdio.h>
#include <stdlib.h>
typedef struct Collection {
int age;
char date[20];
char name[20];
} Collection;
int main(void) {
int i;
int n = 10;
Collection **dataCollection;
dataCollection = malloc(sizeof(Collection*)*n);
dataCollection->age = 20;
for(i = 0; i < n; i++) {
dataCollection[i] = malloc(sizeof(Collection)*n);
printf("Data collection item: %d\n", dataCollection->age);
}
for(i = 0; i < n; i++)
free(dataCollection[i]);
free(dataCollection);
return 0;
}
我收到以下错误:
practice1019.c:18:20: error: member reference base type 'Collection *' (aka 'struct Collection *')
is not a structure or union
dataCollection->age = 20;
~~~~~~~~~~~~~~^ ~~~
practice1019.c:23:56: error: member reference base type 'Collection *' (aka 'struct Collection *')
is not a structure or union
printf("Data collection item: %d\n", dataCollection->age);
从注释开始,您仅在分配足以将dataCollection->age = 20;
指针插入10
的内存块后,就无法分配Collection
。您已经为指针分配了内存,但没有为指针本身存储。
此外,您还必须验证每个分配,例如
dataCollection = malloc(sizeof(Collection*)*n);
if (!dataCollection) { /* validate EVERY allocation */
perror ("malloc-dataCollection");
return 1;
}
现在,在可以将值分配给任何结构的成员之前,必须分配一个内存块来保存该结构,然后将该块的起始地址分配给刚分配的指针之一,例如]]
在for (i = 0; i < n; i++) { dataCollection[i] = malloc(sizeof(Collection)); if (!dataCollection[i]) { /* ditto */ perror ("malloc-dataCollection[i]"); return 1; }
(([note:
* n
中的Collection
之后没有sizeof(Collection)
–否则您将在结构存储上以10
的原因过度分配...)]现在,您可以存储结构,并且可以使用成员(下面的age
)
dataCollection[i]->age = i + 20; printf("Data collection[%d] age: %d\n", i, dataCollection[i]->age); }
每个结构的
free
上的好工作,然后是指针。综上所述,您可以执行以下操作:
#include <stdio.h> #include <stdlib.h> typedef struct Collection { int age; char date; char name; } Collection; int main (void) { int i; int n = 10; Collection **dataCollection; dataCollection = malloc(sizeof(Collection*)*n); if (!dataCollection) { /* validate EVERY allocation */ perror ("malloc-dataCollection"); return 1; } for (i = 0; i < n; i++) { dataCollection[i] = malloc(sizeof(Collection)); if (!dataCollection[i]) { /* ditto */ perror ("malloc-dataCollection[i]"); return 1; } dataCollection[i]->age = i + 20; printf("Data collection[%d] age: %d\n", i, dataCollection[i]->age); } for(i = 0; i < n; i++) free(dataCollection[i]); free(dataCollection); }
示例使用/输出
$ ./bin/datacollection Data collection[0] age: 20 Data collection[1] age: 21 Data collection[2] age: 22 Data collection[3] age: 23 Data collection[4] age: 24 Data collection[5] age: 25 Data collection[6] age: 26 Data collection[7] age: 27 Data collection[8] age: 28 Data collection[9] age: 29
仔细检查,如果您有任何疑问,请告诉我。