C 二维数组上的sizeof操作

C 二维数组上的sizeof操作,c,arrays,string,multidimensional-array,C,Arrays,String,Multidimensional Array,如果我将二维阵列定义为: char *tablechar[][2] = { {"0", "Innova"}, {"2", "Brio" }, {"3", "Alto" }, {"4", "Bolero"}, {"5", "Swift" } }; 和代码位于同一文件中,如下所示: printf("Value = %d\n",sizeof(tablechar)); printf("Value = %d\n",sizeof(t

如果我将二维阵列定义为:

char *tablechar[][2] = {
      {"0",  "Innova"},
      {"2",  "Brio"  },
      {"3",  "Alto"  },
      {"4",  "Bolero"},
      {"5",  "Swift" }
};
和代码位于同一文件中,如下所示:

printf("Value = %d\n",sizeof(tablechar));
printf("Value = %d\n",sizeof(tablechar[0]));
printf("Num of rows = %d\n",sizeof(tablechar)/sizeof(tablechar[0]));
产出如预期:

Value = 40
Value = 8
Num of rows = 5
现在,我在一个函数中传递这个2D矩阵,该函数的定义是:

void printstuff(char *tab[][2])
{
   printf("Value = %d\n",sizeof(tab));
   printf("Value = %d\n",sizeof(tab[0]));
   printf("Num of rows = %d\n",sizeof(tab)/sizeof(tab[0]));
}
我得到以下输出:

Value = 4
Value = 8
Num of rows = 0
上述函数中的编译器警告如下:


为什么sizeof(tab)和sizeof(tablechar)的值不同?

tablechar
是一个实际的数组,但是参数
tab
将被视为指向具有指定类型的数组元素的指针,因此
sizeof(tab)
将是指针的大小,而
sizeof(tablechar)则是指针的大小
将显示阵列的大小


顺便说一下,将类型错误的数据传递到
printf()
会调用未定义的行为。您必须使用
%zu
而不是
%d
来打印
size\t
sizeof
操作符将对其求值。

tablechar
是一个实际数组,但参数
tab
将被视为指向具有指定类型的数组元素的指针,因此
sizeof(tab)
将是指针的大小,
sizeof(tablechar)
将是数组的大小


顺便说一下,将类型错误的数据传递到
printf()
会调用未定义的行为。您必须使用
%zu
而不是
%d
来打印
size\t
,而
sizeof
操作符将对其进行计算。

tablechar
是一个
char
指针数组,而函数参数
tab
是一个指向两个
char
指针数组的指针

void printstuff(char *tab[][2])  
相当于

void printstuff(char *(*tab)[2])   
sizeof(tab)
将给出指针的大小,而不是数组
tablechar
。在C语言中,有一种方法可以将数组传递给函数。当您将数组传递给函数时,根据C规则,数组将衰减为指向其第一个元素的指针。

请始终记住,数组不是指针

tablechar
是一个由
char
指针组成的数组,而函数参数
tab
是指向两个
char
指针组成的数组的指针

void printstuff(char *tab[][2])  
相当于

void printstuff(char *(*tab)[2])   
sizeof(tab)
将给出指针的大小,而不是数组
tablechar
。在C语言中,有一种方法可以将数组传递给函数。当您将数组传递给函数时,根据C规则,数组将衰减为指向其第一个元素的指针。
请始终记住,数组不是以下对象的指针

char *tablechar[][2] = {
      {"0",  "Innova"},
      {"2",  "Brio"  },
      {"3",  "Alto"  },
      {"4",  "Bolero"},
      {"5",  "Swift" }
};
tablechar
的类型是一个包含
5个
元素的数组,每个元素的类型是
char*[2]
。因此
sizeof(tablechar)=5*sizeof(char*[2])=5*8=5*4*2

如果
tablechar[0]
的类型是
char*[2]
,那么
sizeof(tablechar[0])=sizeof(char*)*2=4*2=8

为了

tab
的类型是
char**
,因此
sizeof(tab)=4
tab[0]
的类型是
char*[2]
,因此
sizeof(tab[0])=8

char *tablechar[][2] = {
      {"0",  "Innova"},
      {"2",  "Brio"  },
      {"3",  "Alto"  },
      {"4",  "Bolero"},
      {"5",  "Swift" }
};
tablechar
的类型是一个包含
5个
元素的数组,每个元素的类型是
char*[2]
。因此
sizeof(tablechar)=5*sizeof(char*[2])=5*8=5*4*2

如果
tablechar[0]
的类型是
char*[2]
,那么
sizeof(tablechar[0])=sizeof(char*)*2=4*2=8

为了

tab
的类型是
char**
,因此
sizeof(tab)=4

tab[0]
的类型是
char*[2]
,因此
sizeof(tab[0])=8

4是指针的大小。4的可能重复是指针的大小。是否有任何方法可以在一个函数中采用2D数组形式参数,该函数可以被解码为数组本身,不是指针?有没有办法在一个函数中取一个2D数组形式参数,它可以被解码为数组本身,而不是指针?