如何在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.addr
和array.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); } }