c:传递给函数的wchar\u t数组出错?

c:传递给函数的wchar\u t数组出错?,c,C,我试图将一个3d wchar_t数组传递给名为“test_array”的函数,但当它在内部使用时,我遇到了崩溃 函数,而且我得到了以下警告: -'正在从不兼容的指针类型传递'test_array'的参数1' -'应为'wchar\u t****',但参数的类型为'const wchar\u t*(*)[2][6]' 这是我的完整程序代码: #include <stdio.h> void test_array(wchar_t**** array){ wprintf(array

我试图将一个3d wchar_t数组传递给名为“test_array”的函数,但当它在内部使用时,我遇到了崩溃 函数,而且我得到了以下警告:

-'正在从不兼容的指针类型传递'test_array'的参数1'

-'应为'wchar\u t****',但参数的类型为'const wchar\u t*(*)[2][6]'

这是我的完整程序代码:

#include <stdio.h>

void test_array(wchar_t**** array){
    wprintf(array[0][0][0]);
}

int main(){
    const wchar_t *d[][2][6]={
        { { L"où", L"kjhkh;;" }, { L"où", L"kjhkh;;" } },
        { { L"où", L"kjhkh;;" }},
        { { L"où", L"kjhkh;;" }, { L"où", L"kjhkh;;" } },
        { { L"où", L"kjhkh;;" }, { L"où", L"kjhkh;;" } },
        { { L"où", L"kjhkh;;" }, { L"où", L"kjhkh;;" } },
        { { L"où", L"kjhkh;;" }, { L"où", L"kjhkh;;" } }
    };
    wprintf(d[0][0][0]); //wprintf works fine here
    test_array(d); //but there is the crash
    getch();
}
#包括
无效测试数组(wchar\u t****数组){
wprintf(数组[0][0][0]);
}
int main(){
常量wchar_t*d[][2][6]={
{L“où”,L“kjhh;;”},{L“où”,L“kjhh;;”},
{{L“où”,L“kjhh;;”},
{L“où”,L“kjhh;;”},{L“où”,L“kjhh;;”},
{L“où”,L“kjhh;;”},{L“où”,L“kjhh;;”},
{L“où”,L“kjhh;;”},{L“où”,L“kjhh;;”},
{L“où”,L“kjhh;;”},{L“où”,L“kjhh;;”}
};
wprintf(d[0][0][0]);//wprintf在这里工作得很好
test_数组(d);//但是出现了崩溃
getch();
}

那么有什么问题,我应该怎么做才能解决呢?

正如编译器所说,
wchar\t****
不同于
const wchar\t*(*)[2][6]
。如果要将数组传递给函数,则需要将原型更改为:

void test_array(wchar_t* array[][2][6]) ;
简言之,参数是指向静态分配数组的指针,它不同于指针的指针的指针的指针

基本上,你有:

void f(char c[][4]) {
    c[1][2] ; // is equivalent to *(c + 4 * 1 + 2), because the memory is continuous
}
但是:


使用
char c[4][4]
可以在内存的不同位置分配
4*4*sizeof(char)
字节的内存块(连续块),但是使用
char**c
可以在内存的不同位置分配
4*sizeof(char)
字节。

正如编译器所说,
wchar\u t****
不同于
const wchar\u t*(*)[2][6]
。如果要将数组传递给函数,则需要将原型更改为:

void test_array(wchar_t* array[][2][6]) ;
简言之,参数是指向静态分配数组的指针,它不同于指针的指针的指针的指针

基本上,你有:

void f(char c[][4]) {
    c[1][2] ; // is equivalent to *(c + 4 * 1 + 2), because the memory is continuous
}
但是:

使用
charc[4][4]
您可以分配
4*4*sizeof(char)
字节的内存块(连续块),但是使用
char**c
您基本上可以在内存的不同位置分配4个
4*sizeof(char)
字节。

test_数组(wchar**)
prototype需要一个
wchar\u t****
,您已经向它传递了一个
const wchar\u t*[[2][6]
。一个是定标器,另一个是指向数组的定标器。虽然这些形式可以以类似的方式使用,但它们并不相同

若要消除编译器错误,请更改
Test\u array()
的原型,或更改传递给它的变量的形式

对代码的此修改不会产生错误,因为我已经修改了
test\u array()
的原型。(它也运行,只测试了传递参数的能力)

test_数组(wchar_t****)
prototype需要一个
wchar\u t****
,您已经向它传递了一个
const wchar\u t*[[2][6]
。一个是定标器,另一个是指向数组的定标器。虽然这些形式可以以类似的方式使用,但它们并不相同

若要消除编译器错误,请更改
Test\u array()
的原型,或更改传递给它的变量的形式

对代码的此修改不会产生错误,因为我已经修改了
test\u array()
的原型。(它也运行,只测试了传递参数的能力)


数组成为指针的现象称为“衰减”:

所以数组衰减是数组类型和指针类型之间的隐式转换。编译器只需获取数组的基地址,并对其进行处理。但是需要了解的一件重要事情是,它只在数组的第一级工作:
char[10]
可以衰减为
char*
,但是
char[10][10]
不能衰减为
char**
:它只能衰减为
char[10]
的指针

char**
char[][]
是根本不同的。在
char**x
中,
x[0]
是指向数组第一个字符的指针;但是对于
chary[10][10]
y[0]
是10个字符的数组,而不是指向它的指针。但是,此数组可以衰减为指针

因此很明显,a
wchar\u t[][]]
与a
wchar\u t****
不同。这就是程序崩溃的原因


没有明显的方法将3D数组转换为指向指针的指针指向指向指向指针的指针,存储要求也不一样。正如许多人已经指出的,您可以更改函数的原型以接受不同的指针类型。

数组变为指针的现象称为“衰减”:

所以数组衰减是数组类型和指针类型之间的隐式转换。编译器只需获取数组的基地址,并对其进行处理。但是需要了解的一件重要事情是,它只在数组的第一级工作:
char[10]
可以衰减为
char*
,但是
char[10][10]
不能衰减为
char**
:它只能衰减为
char[10]
的指针

char**
char[][]
是根本不同的。在
char**x
中,
x[0]
是指向数组第一个字符的指针;但是对于
chary[10][10]
y[0]
是10个字符的数组,而不是指向它的指针。但是,此数组可以衰减为指针

因此显然,a
wchar\u t[][]
不是sam
char foo[] = "hello";
char* bar = foo; // DECAY!