【问题标题】:array returning error in c数组在c中返回错误
【发布时间】:2013-11-08 21:22:03
【问题描述】:

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

【问题讨论】:

  • 在 c/c++ 中,函数不返回数组。在 c++ 中,您应该返回一个向量。另外,在 c/c++ 中,数组是通过引用传递的,所以函数正在修改原始数组。
  • 一个数组是通过指向数组的指针的值传递的,这是对数组的引用,因此正如@CroCo所说,它修改了原始(通过)数组。

标签: c arrays return


【解决方案1】:

嗯,首先,您的函数期望返回 int,但您正试图返回 int[][]

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

【讨论】:

  • 我试试这个 return **array 并且它工作。是这样吗?谢谢。
  • 我很困惑。您将数组传递给函数,对其进行修改,然后将其返回。为什么不把它作为一个无效的回报呢?
  • 好的。再次感谢。你知道,初学者为简单的问题思考困难的方式:)
【解决方案2】:

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

【讨论】:

  • 我认为你已经通过 f=reference 传递了你的数组,你不需要返回数组。只需将返回类型更改为 void 或写 return 0
【解决方案3】:

如果您静态创建一个数组,则必须指定两个维度。 数组作为指针传递,如果传递静态数组,最好在函数的参数中给出维度。只需将数组名称传递给任何函数,即使您是动态分配的。如果你想返回一个数组,你应该为一个二维数组返回一个 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]);
    }
}

【讨论】:

    【解决方案4】:

    首先这一行,不是合法的赋值:

    int array[][2]={};  
    

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

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

    second 正如其他人所指出的,此行试图返回 int[][]。这有两个问题,1)C不能返回整数数组的值表示,(虽然它可以返回指针,例如int **,但这里不需要。见底部注释)。并且 2) 原型明确要求int

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

    现在,只需将行更改为:

    return 0;  
    

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

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

    【讨论】:

      【解决方案5】:

      所以,首先,array_function 中的表达式array 的类型是int (*)[2],或“指向int 的2 元素数组的指针”。

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

      当你从main 呼叫phase_array 时,像这样:

      array_function(phase, array);
      

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

      由于您已将array 的第一个元素的地址 传递给array_function,因此您对数组内容所做的任何更改都将反映在main 中,所以您真的不需要不需要返回数组。正如其他人所建议的那样,只需将函数的类型更改为 void 并且不要返回任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 2015-12-28
        • 1970-01-01
        • 2011-12-17
        • 2017-02-01
        相关资源
        最近更新 更多