C语言 malloc 内存分配时类型编译不完整错误


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);

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

相关内容

  • 没有找到相关文章

最新更新