2012-04-06 81 views
0
static char st[][8192]; 
void foo (int tab_size){ 
    st = (char**) malloc ((tab_size+1)*sizeof(char)*8192); 
} 

我收到“malloc”行中st编译错误的类型不完整。哪里不对?谢谢。与malloc内存分配不完整类型的编译错误

+1

你想做什么? – cnicutar 2012-04-06 17:51:31

+0

问题是'st'不是'char **'。另外,你不应该施放'malloc'的结果。 – 2012-04-06 17:53:01

+0

作为一个注释,没有理由在c中抛出'malloc'的返回值,并且实际上会导致问题,因为'void *'会自动提升。 – twain249 2012-04-06 17:53:06

回答

1

由于您没有指定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的指针。

1

您对st的定义确实不是一个完整的类型。

试试这个:

static char (*st)[8192]; 

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

指向数组的指针?真的很好:-) – cnicutar 2012-04-06 17:52:53

+0

@OliCharlesworth它工作正常,但我不能得到现在的东西。这是一种数组?什么意思sizeof(* st)? – TatianaCooper 2012-04-06 18:05:21

0

你是混淆两种完全不同的类型:数组VS指向数组的指针。

static char st[][8192]; 

将st声明为数组类型。它不是一个可修改的左值,不能被赋值。

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

请注意,您的st声明不会分配空间。如果你尝试这样的事情,你会得到一个错误..

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

编译器就像一个宣言对待它,并希望在其他地方看到的实际定义。 它不是一个定义,因为你没有给出数组的第一维的值。

相关问题