static char st[][8192];
void foo ( int tab_size){
st = (char**) malloc ((tab_size+1)*sizeof(char)*8192);
}
我在 st 类型不完整的“malloc”行中收到编译错误。怎么了?谢谢。
你的定义st
确实不是一个完整的类型。
试试这个:
static char (*st)[8192];
void foo (int tab_size){
st = malloc ((tab_size+1)*sizeof(*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
.
您混淆了两种完全不同的类型:数组与指向数组的指针。
static char st[][8192];
将 st 声明为数组类型。它不是可修改的左值,不能分配给它。
如果您的意图是为整数数组分配空间并将其分配给指针,请使用 Oli Charlesworth 建议的指针声明。
请注意,您的 st 声明虽然不会分配空间。如果你尝试这样的事情,你会得到一个错误..
printf("0x%x\n", st);
编译器将其视为声明,并希望在其他地方看到实际定义。它不是一个定义,因为您没有给出数组第一个维度的值。