static char st[][8192];
void foo ( int tab_size){
st = (char**) malloc ((tab_size+1)*sizeof(char)*8192);
}
我在"malloc"行中收到 st 类型不完整的编译错误。怎么了?谢谢。
由于您没有指定st
的内部维度的大小,编译器不知道它需要多大;因此该类型不完整,并且您永远不会在malloc
调用之前完成它。
由于看起来您的意图是动态分配st
,因此请遵循 Oli 的建议并将其声明为指向 8192 元素数组的指针char
:
static char (*st)[8192];
并将您的malloc
语句重写为
st = malloc(sizeof *st * (tab_size+1));
sizeof *st
== sizeof (char [8192])
== 8192。 此表单更简洁,更易于阅读。 另请注意,在 C 中,您不必强制转换 malloc
的结果(除非您使用的是 C89 之前的实现,在这种情况下,我很抱歉(,并且不鼓励这种做法。
这将分配足够的空间来容纳tab_size + 1
每个数组 8192 个字符。
只有在函数参数声明的上下文中,T a[]
才会将a
声明为指向T
的指针。
你对st
的定义确实不是一个完整的类型。
试试这个:
static char (*st)[8192];
void foo (int tab_size){
st = malloc ((tab_size+1)*sizeof(*st));
}
你混淆了两种完全不同的类型:数组与指向数组的指针。
static char st[][8192];
将 st 声明为数组类型。它不是可修改的左值,不能分配给。
如果您的目的是为整数数组分配空间并将其分配给指针,请使用 Oli Charlesworth 建议的指针声明。
请注意,您的 st 声明不会分配空间。 如果你尝试这样的事情,你会得到一个错误。
printf("0x%xn", st);
编译器将其视为声明,并希望在其他地方看到实际定义。它不是一个定义,因为您还没有给出数组第一维的值。