0
static char st[][8192];
void foo ( int tab_size){
    st = (char**) malloc ((tab_size+1)*sizeof(char)*8192);
}

我在 st 类型不完整的“malloc”行中收到编译错误。怎么了?谢谢。

4

3 回答 3

1

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

试试这个:

static char (*st)[8192];

void foo (int tab_size){
    st = malloc ((tab_size+1)*sizeof(*st));
}
于 2012-04-06T17:50:11.870 回答
1

由于您没有为 指定内部尺寸的大小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.

于 2012-04-06T18:05:59.420 回答
0

您混淆了两种完全不同的类型:数组与指向数组的指针。

static char st[][8192];

将 st 声明为数组类型。它不是可修改的左值,不能分配给它。

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

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

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

编译器将其视为声明,并希望在其他地方看到实际定义。它不是一个定义,因为您没有给出数组第一个维度的值。

于 2012-04-06T18:01:44.813 回答