c++中访问双数组的错误

c++ accessing double array error working in c

本文关键字:错误 数组 访问 c++      更新时间:2023-10-16
#include<stdio.h>
using namespace std;
void fun(int** a){}
int main()
{
    int n;
    scanf("%d",&n);
    int a[n][n];
    fun(a);
    return 0;
}

在c++中得到这个错误,但在C中工作得很好但是工作类型转换为(void*)a然后转换为array=(int**)a:

test_.cpp:9:8: error: cannot convert
   ‘int (*)[(((unsigned int)(((int)n) + -0x00000000000000001)) + 1)]’
to ‘int**’ for argument ‘1’ to ‘void fun(int**)’
tried to pass a[][size] but size is not known

双精度数组不能转换为双精度指针。

像这样传递一个双精度数组给你的函数:

void fun(int arr[][5]); 

您的代码有几个问题。一个是C语言,另一个是c++。

C问题:
即使在C语言中,多维数组int a[n][n]也不会转换为int**。粗糙(或锯齿)多维数组与连续多维数组之间存在巨大差异。不规则数组被声明和分配为

  • int ** jagged_array
    以这种风格声明的锯齿数组显然可以作为int**参数传递给某些函数;不涉及转换。对于这种类型的数组,程序员必须为指向数组中每一行的int*指针数组分配(并最终释放)存储空间,还必须为数组的每一行分配(并最终释放)存储空间。

  • int * jagged_array[size_spec] .
    以这种风格声明的锯齿数组也可以作为int**参数传递给某些函数,因为数组在C(和c++)中衰减为指针的方式。对于这种类型的数组,程序员必须为数组的每一行分配(最终释放)存储空间。

注意,在这两种形式中,在内存中都有一个显式的位置用于指向数组行第0个元素的int*指针。这与多维数组不同。多维数组中指向行的指针是计算的,而不是存储的。声明为int a[n][n]的多维数组不能衰变为int**。相反,它会衰变成int*[n]。在C语言中,接收可变长度多维数组(如int a[n][n])的函数应该声明为<return_type> fund (int n, int vla[n][n])。(数组参数也可以指定为vla[][n];外部尺寸不需要。)


c++问题:
您正在使用可变长度数组。c++不支持C99的概念。这个概念在1998年c++的原始版本中是不存在的。2003年的c++标准是对1998年c++标准的一个小修订,所以它没有跳到C99。最新的c++标准c++ 11的作者明确拒绝支持这些C99变长数组。在c++中不能使用可变长度数组,至少不能移植。

T[N][N]衰变时,它变成T*[N],在传递数组时没有可行的转换

在将2D数组传递给函数时必须指定第二次元的大小。否则,如果不知道二维数组的大小,编译器就无法对二维数组元素进行寻址。使用

f(a[][5])