我被困在那段代码里了如何为结构体
分配内存?typedef struct {
int a, b, c, d;
} FourInts;
void fillArray(int* array, int len) {
printf("Filling an array at address %p with %d "
"valuesn", 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的代码错误是什么
下面的函数调用是不正确的:
fillArray(heap_struct_FourInts->*a), 4);
a
是int
,而不是指向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);
要修复第一个警告,请从变量类型中删除struct
,因为它不是struct
,而是struct
的typedef
(因此,警告类型不匹配)。至于错误,使用&heap_struct_FourInts->a
传递结构中第一个int的地址。
然而,代码可能调用未定义的行为,因为int
不需要在内存中连续。例如,编译器可以默认配置为填充8字节边界,在这种情况下,每个int
之后将有4个未使用的字节(假设我们在具有4字节int
的平台上)。阅读struct
填充以获取更多信息。这种特殊的填充是不太可能出现的情况,但这是需要记住的。