字符*数组的C大小
我有一个字符*数组的C大小,c,sizeof,C,Sizeof,我有一个char*数组,如下所示: char *tbl[] = { "1", "2", "3" }; 如何使用sizeof运算符获取数组的元素数,这里是3 下面的方法确实有效,但是否正确 int n = sizeof(tbl) / sizeof(tbl[0]) 对 这是最典型的方法 请注意,对数组大小使用int并不是最好的主意。更短、更干净的版本看起来就像 sizeof tbl / sizeof *tbl :)是的,它将为您提供数组tb1中的元素数 int n = sizeof(tbl)
char*
数组,如下所示:
char *tbl[] = { "1", "2", "3" };
如何使用sizeof
运算符获取数组的元素数,这里是3
下面的方法确实有效,但是否正确
int n = sizeof(tbl) / sizeof(tbl[0])
对
这是最典型的方法
请注意,对数组大小使用
int
并不是最好的主意。更短、更干净的版本看起来就像
sizeof tbl / sizeof *tbl
:)是的,它将为您提供数组tb1中的元素数
int n = sizeof(tbl) / sizeof(tbl[0])
解释:
sizeof(tb1)将给出整个数组的大小,即tb1=3个字节
sizeof(tb1[0])给出字符大小,因为tb1[0]给出字符值(地址tb1+0处的值)=1字节
这两个元素的除法将为您提供3个元素使用
大小\u t
作为大小是否有问题?或者至少一些未签名的?sizeof(char)
不会为您保存一个解引用操作。编译器通过理解tbl[0]的类型来计算其大小,但实际上并不为其生成代码。如果数组的类型从char
更改为其他类型,sizeof(char)
而不是sizeof(tbl[0])
将为您带来的唯一问题是将来的问题。@Shahbaz我相信一旦编译器看到为可变大小数组调用sizeof
,它可能会将其优化为“将数组长度乘以元素大小”,这将导致“几乎在编译时”sizeof。在运行时没有所谓的“数组”,因此没有地方存储其大小。@Shahbaz但如果我们在编译时知道int array[n];length=sizeof(array)/sizeof(*array)
我们可以假设length=n;
并避免任何计算。用sizeof(char)
替换sizeof(tbl[0])
不是优化,也不是正确的。tbl[0]
是char*
,而不是char
(而且sizeof(char)
根据定义是1),所以你的“优化”“版本只生成数组的大小(以字节为单位)sizeof
总是在编译时进行计算,除非参数是可变长度数组。这实际上已经得到了回答,这是正确的方法。如果数组作为参数接收,则不会。检查。可能重复@Elideb:严格来说,数组不能是参数。定义为char*tbl[]
的参数实际上属于char**
类型;类型是在编译时调整的。@KeithThompson是的,我知道,但我仍然可以找到使用数组作为参数的代码,人们希望它们的行为是这样的。在谈论它们时,我会尽量更准确。tbl
是char*
的数组,而不是char
的数组。如果sizeof(char*)==4
,则您将12个字节除以4个字节,生成3个数组元素,而不是3个字节。很抱歉,键入错误,应该是3个元素而不是字节。:)@tbl仍然不是字符数组。不,仍然不正确tbl
是一个字符数组,而不是字符数组。tbl[0]
的大小不是1字节,除非您在一个具有1字节指针的奇怪系统上。但是,tb1[0]的大小为地址tb1[0]处存在的值的大小,该值必须是字符,对吗?。。。
int n = sizeof(tbl) / sizeof(tbl[0])