malloc内存分配不完整的类型编译错误

时间:2012-04-06 17:48:42

标签: c types malloc

static char st[][8192];
void foo ( int tab_size){
    st = (char**) malloc ((tab_size+1)*sizeof(char)*8192);
}

我在“malloc”行中收到st具有不完整类型的编译错误。怎么了?感谢。

3 个答案:

答案 0 :(得分:1)

st的定义确实不完整。

请改为尝试:

static char (*st)[8192];

void foo (int tab_size){
    st = malloc ((tab_size+1)*sizeof(*st));
}

答案 1 :(得分:1)

由于您未指定st的内部维度的大小,因此编译器不知道它需要多大;因此类型不完整,您永远不会在malloc调用之前完成它。

由于看起来您的意图是动态分配st,请使用Oli的建议并将其声明为指针char的8192元素数组:< / p>

static char (*st)[8192];

并将您的malloc声明重写为

st = malloc(sizeof *st * (tab_size+1));

sizeof *st == sizeof (char [8192]) == 8192。此表单更清晰,更易于阅读。另请注意,在C中,您不必转换malloc的结果(除非您使用的是C89之前的实现,在这种情况下,我很抱歉),并且不鼓励这种做法。

这将分配足够的空间来容纳每个8192个字符的tab_size + 1个数组。

仅在函数参数声明的上下文中,T a[]a声明为T的指针。

答案 2 :(得分:0)

您混淆了两种完全不同的类型:数组与指向数组的指针。

static char st[][8192];

声明st为类型数组。它不是可修改的左值,不能分配给。

如果您的意图是为整数数组分配空间并将其分配给指针,请使用Oli Charlesworth建议的指针声明。

请注意,您的st声明不会分配空间。如果你尝试这样的话,你会收到错误..

printf("0x%x\n", st);

编译器将其视为声明,并期望在其他地方看到实际定义。 它不是定义,因为你没有给出数组第一维的值。