23

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

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

函数的这个 line mallocing 空间给了我一个分段错误,并且想知道你是否可以告诉我一个正确的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++;
}
4

2 回答 2

29

分配对所有类型都一样。如果你需要分配一个line结构数组,你可以这样做:

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

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

请注意,使用更好的样式:

sizeof(*array)

代替:

sizeof(struct line)

这样做的原因是,如果您更改array. 在这种情况下,这不太可能,但这只是一个值得习惯的普遍事情。

另请注意,通过ing 结构可以避免一遍又一遍地重复单词structtypedef

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

然后你可以这样做:

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

当然不要忘记也为array.addrand分配内存array.inst

于 2013-10-27T01:40:05.413 回答
8

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

}

对于结构线数组...

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);
    }      


}

添加到地址注释
解决@Adam Liss 的此答案下的注释,以下代码说明了使用strdup()的以下改进:1) 仅使用所需的内存。2) 一步完成内存创建和复制操作,所以如下块:

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");
}

变得:

for(i=0;i<10;i++)
{
  line[i].addr = strdup("someString");
  line[i].inst = strdup("someOtherString");
}

还有一点需要注意:上面的例子中没有包含错误处理以避免混淆主要概念:但是为了完整起见,因为两者都malloc() 可能 strdup()失败,这两个函数的实际用法应该在使用前包含一个测试,例如:

而不是

  line[i].addr = strdup("someString");
  line[i].inst = strdup("someOtherString");

代码应包括

  line[i].addr = strdup("someString");
  if(!line[i].addr)
  {
      //error handling code here
  }
  line[i].inst = strdup("someOtherString");
  if(!line[i].inst)
  {
      //error handling code here
  }
于 2013-10-27T01:55:44.933 回答