如何在C中正确地malloc for struct数组

我将使用strtok读取两组char* (或字符串),并且由于这两组chars是相关的, (address : command\n)我决定使用一个结构。

 struct line* array = (struct line*)malloc(sizeof(file) * sizeof(struct line*)); 

这个函数的行malloc空间给了我一个分段错误,并想知道你是否可以告诉我一个正确的malloc空间方式。 对于上下文,这是我的其余代码:

 struct line { char* addr; char* inst; }; while loop{ x = strtok(line,": "); y = strtok(NULL,"\n"); strcpy(array[i].addr,x); //assume that x and y are always 3characters strcpy(array[i].inst,++y); i++; } 

所有类型的分配都是相同的。 如果需要分配一个line结构数组,可以使用:

 struct line* array = malloc(number_of_elements * sizeof(struct line)); 

在您的代码中,您分配的数组具有适合line指针的大小,而不是line结构。 另请注意,没有理由malloc()的返回值。

请注意,它的使用方式更好:

 sizeof(*array) 

代替:

 sizeof(struct line) 

这样做的原因是,如果您更改array类型,分配仍将按预期工作。 在这种情况下,这不太可能,但这只是一个值得习惯的一般事情。

还要注意,通过typedef struct来避免不得不一遍又一遍地重复单词struct:

 typedef struct line { char* addr; char* inst; } line; 

你可以这样做:

 line* array = malloc(number_of_elements * sizeof(*array)); 

当然不要忘记为array.addrarray.inst分配内存。

对于您所描述的内容, 您不需要为结构分配内存而是需要为成员char *addr;分配内存char *addr;char *inst; 。 如果您希望拥有该结构的单个副本,则代码的第一部分将说明如何初始化和分配值。 如果你想要一个数组,第二个代码示例说明了这些差异。

这说明了如何为单个结构行的成员分配内存

 typedef struct { char* addr; char* inst; }LINE; LINE line; int main(void) { strcpy(line.addr, "anystring"); //will fail line.addr = malloc(80); line.inst = malloc(80); strcpy(line.addr, "someString");//success; strcpy(line.inst, "someOtherString");//success; } 

对于struct line的数组……

 typedef struct { char* addr; char* inst; }LINE; //same struct definition LINE line[10]; //but create an array of line here. int main(void) { int i; for(i=0;i<10;i++) { line[i].addr = malloc(80); line[i].inst = malloc(80); } for(i=0;i<10;i++) { strcpy(line[i].addr, "someString"); strcpy(line[i].inst, "someOtherString"); } //when done, free memory for(i=0;i<10;i++) { free(line[i].addr); free(line[i].inst); } }