static char st[][8192];
void foo (int tab_size){
st = (char**) malloc ((tab_size+1)*sizeof(char)*8192);
}
我收到“malloc”行中st编译错误的类型不完整。哪里不对?谢谢。与malloc内存分配不完整类型的编译错误
static char st[][8192];
void foo (int tab_size){
st = (char**) malloc ((tab_size+1)*sizeof(char)*8192);
}
我收到“malloc”行中st编译错误的类型不完整。哪里不对?谢谢。与malloc内存分配不完整类型的编译错误
由于您没有指定st
的内部尺寸的大小,编译器不知道它需要多大;因此该类型为不完整,并且您从未在调用malloc
之前完成它。
因为它看起来像你的意图是要动态地分配st
,去与奥利奇的意见,并声明为指针到char
8192元素的数组:
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
的指针。
您对st
的定义确实不是一个完整的类型。
试试这个:
static char (*st)[8192];
void foo (int tab_size){
st = malloc ((tab_size+1)*sizeof(*st));
}
指向数组的指针?真的很好:-) – cnicutar 2012-04-06 17:52:53
@OliCharlesworth它工作正常,但我不能得到现在的东西。这是一种数组?什么意思sizeof(* st)? – TatianaCooper 2012-04-06 18:05:21
你是混淆两种完全不同的类型:数组VS指向数组的指针。
static char st[][8192];
将st声明为数组类型。它不是一个可修改的左值,不能被赋值。
如果您的意图是为整数数组分配空间并将其分配给指针,请使用Oli Charlesworth建议的指针声明。
请注意,您的st声明不会分配空间。如果你尝试这样的事情,你会得到一个错误..
printf("0x%x\n", st);
编译器就像一个宣言对待它,并希望在其他地方看到的实际定义。 它不是一个定义,因为你没有给出数组的第一维的值。
你想做什么? – cnicutar 2012-04-06 17:51:31
问题是'st'不是'char **'。另外,你不应该施放'malloc'的结果。 – 2012-04-06 17:53:01
作为一个注释,没有理由在c中抛出'malloc'的返回值,并且实际上会导致问题,因为'void *'会自动提升。 – twain249 2012-04-06 17:53:06