【发布时间】:2019-04-05 11:13:56
【问题描述】:
我试图从一个函数返回一个连续的内存分配数组,但我不断收到错误。
编译器返回警告说return from incompatible pointer type [-Wincompatible-pointer-types]
谁能告诉我我做错了什么?
int *test() {
size_t rows, cols;
// assign rows and cols
rows = 3;
cols = 3;
int count = 0;
int (*arr)[cols] = malloc(sizeof *arr * rows);
if (arr) {
// do stuff with arr[i][j]
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; j++) {
arr[i][j] = count;
count++;
}
/* code */
}
}
return arr;
}
int main() {
size_t rows, cols;
// assign rows and cols
rows = 3;
cols = 3;
int count = 0;
int (*arr)[cols] = malloc(sizeof *arr * rows);
arr = test();
int i = 0;
int j = 0;
for (i = 0; i < rows; ++i) {
for (j = 0; j < 3; ++j)
printf("%d ", arr[i][j]);
printf("\n");
}
free(arr);
}
它应该返回一个二维数组,但返回一个错误,并且在 ubuntu 上使用 gcc
【问题讨论】:
-
你的编译器是什么?
-
代码
int *test()声明test以返回int *,但arr声明为int (*arr)[cols],因此return arr返回int (*)[cols]。 C 中没有办法返回指向可变长度数组的指针。相反,test可以返回一个void *,然后调用者将其转换为正确的类型。 -
顺便说一句,永远不要在 C 中声明带有空参数列表的函数,如
int *test()。这是一种旧的声明风格,不应该在新代码中使用,因为它缺乏类型检查功能。要声明不带参数的函数,请使用(void)作为其参数列表。如果函数接受参数,请在参数列表中列出它们及其类型。 -
这也适用于
main。不要使用int main()。main应使用int main(void)或int main(int argc, char *argv[])或您的实现支持的其他形式声明。
标签: c arrays multidimensional-array signature