c:传递给函数的wchar\u t数组出错?
我试图将一个3d wchar_t数组传递给名为“test_array”的函数,但当它在内部使用时,我遇到了崩溃 函数,而且我得到了以下警告: -'正在从不兼容的指针类型传递'test_array'的参数1' -'应为'wchar\u t****',但参数的类型为'const wchar\u t*(*)[2][6]' 这是我的完整程序代码: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
#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个字符的数组,而不是指向它的指针。但是,此数组可以衰减为指针
因此很明显,awchar\u t[][]]
与awchar\u t****
不同。这就是程序崩溃的原因
没有明显的方法将3D数组转换为指向指针的指针指向指向指向指针的指针,存储要求也不一样。正如许多人已经指出的,您可以更改函数的原型以接受不同的指针类型。数组变为指针的现象称为“衰减”: 所以数组衰减是数组类型和指针类型之间的隐式转换。编译器只需获取数组的基地址,并对其进行处理。但是需要了解的一件重要事情是,它只在数组的第一级工作:
char[10]
可以衰减为char*
,但是char[10][10]
不能衰减为char**
:它只能衰减为char[10]
的指针
char**
和char[][]
是根本不同的。在char**x
中,x[0]
是指向数组第一个字符的指针;但是对于chary[10][10]
,y[0]
是10个字符的数组,而不是指向它的指针。但是,此数组可以衰减为指针
因此显然,awchar\u t[][]
不是sam
char foo[] = "hello";
char* bar = foo; // DECAY!