c中的数组返回错误

时间:2013-11-08 21:22:04

标签: c arrays return

我在返回行中收到错误。 “与来自结果类型为'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
}

5 个答案:

答案 0 :(得分:1)

首先,您的功能期望int返回,但您尝试返回int[][]

并且,您无法在c中按值返回数组。您需要返回指针,或将数组包装为struct的一部分。

答案 1 :(得分:0)

您有int作为函数的返回类型(int array_function())但是正在尝试返回指针(return array;)。由于看起来您不需要返回任何内容,只需将返回类型设为voidreturn 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)

因此,首先,arrayarray_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,并且不返回任何内容。