首页 文章

结构数组中的内存分配

提问于
浏览
1
airPdata **airport = malloc(sizeof(airport) * (50+1));
    printf("Passes airPdata **airport\n");
//  buffer = malloc(sizeof(char) * (50+1));

// puts the strings into char line
while(fgets(line, 1024, fp) != NULL)
{
    // has pointer value point to line
    value = line;
    printf("Before creating space for struct members\n");
    // creating space for the struct members
    airport[j]->LocID = malloc(sizeof(char)*(50+1));

    airport[j]->fieldName = malloc(sizeof(char)*(50+1));

    airport[j]->city = malloc(sizeof(char)*(50+1));

    printf("after\n");

我正在尝试创建一个结构数组,但我无法弄清楚如何为结构的成员分配内存..它保持segfaulting . LocID,fieldName和city都是char *

编辑***我发现了问题 . 使用双指针不需要分配机场,但仍需要分配机场成员 .

//为struct airPdata **机场分配内存;

// buffer = malloc(sizeof(char)*(50 1));

// puts the strings into char line
while(fgets(line, 1024, fp) != NULL)
{
    // has pointer value point to line
    value = line;
printf("Yes\n");
    // creating space for the struct members
    airport[j]->LocID = malloc(sizeof(char)*(50+1));    
    airport[j]->fieldName = malloc(sizeof(char)*(50+1));
    airport[j]->city = malloc(sizeof(char)*(50+1));
    j++;
 }

但是,当程序第二次绕着while循环返回并遇到 airport[j]->LocID = malloc 时,程序会出错 .

2 回答

  • 0

    OP的代码最大的失败是没有为每个 airport[i] 分配内存


    使用 airPdata **airportI want to use an array of pointers,代码需要分配2个级别并使用arrray .

    数组内存 airport[]
    分配并分配给 airport[i]OP missed this part. )的每个元素的内存
    内存已分配并分配给各个成员,如 airport[i].LocID


    数组 airport 的内存很简单,如下所示 . airPdata **airport 是指针而不是数组 . 而是使用数组,因为这是规定的设计目标 .

    // define array element count. 
    #define AIRPORT_N 100 
    // Declare the array.
    airPdata *airport[AIRPORT_N];
    // Keep tack of how much of the array is used.
    size_t n = 0;
    

    现在分配,读取并开始填充数组,根据需要进行分配 .

    #define AIRPORT_STRING_SIZE (50 + 1)
    char line[1024];
    while(n < AIRPORT_N && fgets(line, sizeof line, fp)) {
      // Allocate memory for one element of `airport`
      // Notice no cast nor type coded here.
      airport[n] = malloc(sizeof *(airport[n]));
      if (airport[n] == NULL) {
        // Something simple for now.
        fprintf(stderr, "OOM\n");
        break;
      }
      // Create space for each string,  
      // TODO: add check for Out-of-Memory
      airport[n]->LocID = malloc(AIRPORT_STRING_SIZE);
      airport[n]->fieldName = malloc(AIRPORT_STRING_SIZE);
      airport[n]->city = malloc(AIRPORT_STRING_SIZE);
    
      // Code to parse `line` into `airport[n]` members.
    
      // Usually the parsing happens first and if successful, the above allocations occur.
    
      // If the `LocID` string (and others) need not change then 
      //   use below to allocate a right-sized memory
      //   after parsing instead of allocating to some max size, like above.
      airport[n]->LocID = strdup(LocID_string);
    
      n++;
    }
    

    后来释放了一切

    for (size_t i = 0; i < n; i++) {
      free(airport[i]->LocID);
      free(airport[i]->fieldName);
      free(airport[i]->city);
      free(airport[i]);
    }
    

    细节:请注意以下细微错误 . 它分配的大小为 airport ,类型为 airPdata ** .

    相反,它应该分配 * airport 的大小,类型为 airPdata * .

    通常,所有类型的对象指针都具有相同的大小,但是在C中的所有类型中都没有指定相同的指针 .

    最好分配到类型的去引用指针的大小 . 它更可能编码正确,更容易审查和维护 .

    // airPdata **airport = malloc(sizeof(airport) * (50+1));
    airPdata **airport = malloc(sizeof *airport * (50+1));
    
  • 1

    你正在混合使用两种方法 .

    你有一系列连续的机场

    airports -----> ap1 | ap2 | ap3
    

    B你有一系列指向机场的指针(不一定在内存中彼此相邻)

    airports --> aptr1 | aptr2 | aptr3
                   |        |        |
                   v        v        v
                  ap1       ap2     ap3
    

    如果你想要A,你的malloc会混合A和B.

    airPdata *airport = malloc(sizeof(airport) * (50+1));
    

    如果你想B做

    airPdata **airport = malloc(sizeof(airport*) * (50+1));
    

    然后,您将不得不为每个指针槽分配一个机场对象 .

相关问题