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数组形式参数,它可以被解码为数组本身,而不是指针?