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

时间:2013-10-27 01:34:50

标签: c arrays struct malloc

我将使用char*读取两组strtok(或字符串),因为这两组字符是相关的,(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++;
}

2 个答案:

答案 0 :(得分:18)

分配适用于所有类型。如果需要分配line结构数组,可以使用:

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

在您的代码中,您分配的数组具有line指针的适当大小,而不是line结构。另请注意,没有理由强制转换malloc()

的返回值

请注意,使用它的风格更好:

sizeof(*array)

而不是:

sizeof(struct line)

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

另请注意,通过struct结构可以避免不得不一遍又一遍地重复单词typedef

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

然后你可以这样做:

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

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

答案 1 :(得分:4)

对于您所描述的内容, 您不需要为结构分配内存 而不是,您需要为内存分配内存成员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);
    }      


}