1

我在返回行中遇到错误。“从结果类型为'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
}
4

5 回答 5

1

好吧,首先,您的函数期望int返回,但您试图返回一个int[][].

而且,您不能在 c 中按值返回数组。您需要返回一个指针,或者将数组包装为struct.

于 2013-11-08T21:25:30.523 回答
0

因此,首先,表达式的类型arrayarray_functionint (*)[2]或“指向 2 元素数组的指针int”。

除非它是sizeofor 一元运算符的操作数&,或者是用于在声明中初始化另一个数组的字符串文字,否则“N 元素数组T”类型的表达式将被转换(“衰减”)为键入“pointer to T”,表达式的值将是数组第一个元素的地址。

当您从 调用phase_arraymain,如下所示:

array_function(phase, array);

表达式array的类型为“2 元素数组的 2 元素数组int”;因为它不是一元运算符sizeof或一元运算符的操作数&,所以它被转换为“指向 2 元素数组的指针”类型的表达式int,并将其值设置为第一个元素的地址 ( &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函数中使用过),但表达式的类型arrayint (*)[2]; 因此错误消息。这两种类型不*兼容”,编译器将此标记为错误。

由于您已经传递了to的第一个元素的地址,因此您对数组内容所做的任何更改都会反映在 中,因此您实际上不需要返回数组。正如其他人所建议的那样,只需将函数的类型更改为并且不返回任何内容。 arrayarray_functionmainvoid

于 2013-11-08T23:00:32.683 回答
0

首先,这一行不是合法的分配:

int array[][2]={};  

对于你正在做的事情,这条线会起作用:

int array[][2]={0,0,0,0};  

第二正如其他人指出的那样,这条线正在尝试返回int[][]。这有两个问题,1)C 不能返回整数数组的值表示,(虽然它可以返回指针,例如int **,你不需要在这里。见底部的注释)。2)原型明确要求int

return array;  //<------------- error line  

现在,只需将行更改为:

return 0;  

这两个更改将导致您的代码填充array[][] 没有错误。

注意:因为您是通过引用传递数组,所以 (array_function(phase, array);) 分配给数组的值array_function()可以在main()函数中返回,而无需将它们作为return. (即int ** array_function(phase, array)

于 2013-11-08T22:35:45.627 回答
0

您有int作为函数的返回类型(intarray_function() ),但正试图返回一个指针(return array;)。因为看起来您不需要返回任何东西,只需将返回类型设置为voidor return 0。由于数组是通过引用传递的,因此它会自动获取您在函数内对其所做的更改。

于 2013-11-08T21:24:56.433 回答
0

如果您静态创建一个数组,则必须指定两个维度。数组作为指针传递,如果传递静态数组,最好在函数的参数中给出维度。只需将数组名称传递给任何函数,即使您是动态分配的。如果要返回数组,则应为 2D 数组返回 int* 或 int**。

假设您想在函数中创建一个数组并让调用者拥有它。

int *createArray(int size)
{
    int *array = malloc(size * sizeof(int));
    return array;
}

你可以从你的 main 调用这个函数。

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]);
    }
}
于 2013-11-08T22:37:08.580 回答