我在返回行中收到错误。 “与来自结果类型为'int'的函数返回'int(*)[2]'的整数转换不兼容的指针”有人可以解释这个错误背后的理论是什么以及如何修复它?我仍然得到正确的结果,但不知道这个错误。 (提示:我很初学者) 这是我的测试代码。
#include <stdio.h>
#include<string.h>
/* two diminsanl array testing*/
int array_function(int phase,int array[][2]);
int main()
{
int phase =1;
int array[][2]={};
array_function(phase, array);
phase =2;
array_function(phase, array);
return 0;
}
int array_function(int phase, int array[][2])
{
if(phase==1)
{
array[0][0]=1;
array[0][1]=2;
array[1][0]=3;
array[1][1]=4;
}
if(phase==2)
{
printf("%d\n",array[0][0]);
}
return array; //<------------- error line
}
答案 0 :(得分:1)
首先,您的功能期望int
返回,但您尝试返回int[][]
。
并且,您无法在c中按值返回数组。您需要返回指针,或将数组包装为struct
的一部分。
答案 1 :(得分:0)
您有int
作为函数的返回类型(int
array_function())但是正在尝试返回指针(return array;
)。由于看起来您不需要返回任何内容,只需将返回类型设为void
或return 0
。由于数组是通过引用传递的,因此它会自动获取您在函数内对其执行的更改。
答案 2 :(得分:0)
首先 此行不属于合法转让:
int array[][2]={};
对于你正在做的事情,这条线会起作用:
int array[][2]={0,0,0,0};
第二 正如其他人所指出的,此行正在尝试返回int[][]
。这有两个问题,1)C不能返回一个int数组的值表示(虽然它可以返回指针,例如int **
,但你不需要这里。请参阅底部的注释)。 2)原型明确要求int
return array; //<------------- error line
目前,只需将该行更改为:
return 0;
这两项更改将导致您的代码填充array[][]
而没有错误。
注意: 因为您通过引用传递数组,(array_function(phase, array);
)分配给array_function()
中数组的值可用在main()
函数中,没有将它们作为return
返回。 (即int ** array_function(phase, array)
)
答案 3 :(得分:0)
如果静态创建数组,则必须指定两个维度。 数组作为指针传递,如果传递静态数组,最好在函数的参数中给出维度。只需将数组名称传递给任何函数即使动态分配它也是如此。如果要返回数组,则应为2D数组返回int *或int **。
假设你想在函数中创建一个数组,让调用者拥有它。
int *createArray(int size)
{
int *array = malloc(size * sizeof(int));
return array;
}
您可以从主电话中调用此功能。
int *list;
list = createArray(2);
并像任何其他数组一样修改列表。
这是你的代码。
#include <stdio.h>
/* two diminsanl array testing*/
void array_function(int phase, int array[2][2]);
int main()
{
int phase = 1;
int array[2][2];
array_function(phase, array);
phase = 2;
array_function(phase, array);
return 0;
}
void array_function(int phase, int array[2][2])
{
if (phase == 1)
{
array[0][0] = 1;
array[0][1] = 2;
array[1][0] = 3;
array[1][1] = 4;
}
if (phase == 2)
{
printf("%d\n",array[0][0]);
}
}
答案 4 :(得分:0)
因此,首先,array
中array_function
的表达式类型为int (*)[2]
,或“指向int
的2元素数组的指针”。
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N-element array of T
“将被转换(”衰减“)为”指向T
的指针“的表达式,表达式的值将是数组的第一个元素的地址。
当您从phase_array
致电main
时,就像这样:
array_function(phase, array);
表达式array
具有类型“2元素数组int
的2元素数组”;因为它不是sizeof
或一元&
运算符的操作数,所以它被转换为类型为“指向int
的2元素数组的指针”的表达式,并且其值已设置到第一个元素的地址(&array[0]
)。此指针值将传递给array_function
。
在函数参数列表的上下文中,表单T a[N]
和T a[]
的声明将被解释为T *a
;所有这三个都将a
声明为指向T
的指针。所以,
int array_function(int phase, int array[][2])
与
相同int array_function(int phase, int (*array)[2])
我们收到了您的错误消息:您已声明array_function
返回int
(您在main
函数中没有使用过,{b})表达式array
的类型是int (*)[2]
;因此错误消息。这两种类型不兼容“,编译器将此标记为错误。
由于您已将array
的第一个元素的地址传递给array_function
,因此您对数组内容所做的任何更改都将反映在{{1}中,所以你真的不需要返回数组。正如其他人所建议的那样,只需将函数类型更改为main
,并且不返回任何内容。