使用内存分配的struct指针

时间:2014-07-10 20:18:15

标签: c struct malloc

我被困在那段代码中 如何为该结构进行内存分配

typedef struct {
  int a, b, c, d;
} FourInts;


void fillArray(int* array, int len) {
  printf("Filling an array at address %p with %d "
         "values\n", array, len);
  for (int i = 0; i < len; ++i) {
    array[i] = (i * 3) + 2;
    // assert() verifies that the given condition is true
    // and exits the program otherwise. This is just a
    // "sanity check" to make sure that the line of code
    // above is doing what we intend.
    assert(array[i] == ( (i * 3) + 2) );
  }
  printf("Done!\n");
}


/***********from here the problem *******/
struct FourInts *heap_struct_FourInts = (FourInts*) malloc(sizeof( FourInts) * 1);

  fillArray(heap_struct_FourInts->*a), 4);


  free(heap_struct_FourInts);

编译器给了我那个错误

   arrays.c:222:43: warning: initialization from incompatible pointer type [enabled by default]
   struct FourInts *heap_struct_FourInts = (FourInts*) malloc(sizeof( FourInts) * 1);
                                           ^
arrays.c:224:33: error: dereferencing pointer to incomplete type
   fillArray(heap_struct_FourInts->a, 4);
                             ^

struct和malloc的代码中的错误是什么?

2 个答案:

答案 0 :(得分:1)

要修复第一个警告,请从变量类型中删除struct,因为它不是struct,而是typedef的{​​{1}}(因此,警告类型不匹配)。至于错误,请使用struct传递结构中第一个int的地址。

但是,代码可能会调用未定义的行为,因为&heap_struct_FourInts->a不需要在内存中连续。例如,编译器可以配置为默认填充到8字节边界,在这种情况下,每个int之后将有4个未使用的字节(假设我们在具有4字节{{1}的平台上}})。阅读int填充以获取更多信息。这种特殊的填充是一种非常不可能的情况,但需要记住这一点。

答案 1 :(得分:1)

以下函数调用不正确:

fillArray(heap_struct_FourInts->*a), 4);

aint,而不是指向int的指针,因此您无法取消引用它。 (即使它是指向int的指针,您的语法也不正确。)

另外,在你的结构......

typedef struct {
    int a, b, c, d;
} FourInts;

...你没有声明4个int的数组,而是4个独立的int。如果您希望a成为长度为4的int数组,则需要声明如下:

typedef struct {
    int a[4], b, c, d;
} FourInts;

现在你可以这样称呼你:

FourInts *heap_struct_FourInts = malloc(sizeof(*heap_struct_FourInts);
fillArray(heap_struct_FourInts->a), 4);

以下是等效的:

fillArray((*heap_struct_FourInts).a), 4);