static char st[][8192];
void foo ( int tab_size){
st = (char**) malloc ((tab_size+1)*sizeof(char)*8192);
}
我在“malloc”行中收到st具有不完整类型的编译错误。怎么了?感谢。
答案 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);
编译器将其视为声明,并期望在其他地方看到实际定义。 它不是定义,因为你没有给出数组第一维的值。