Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符*数组的C大小_C_Sizeof - Fatal编程技术网

字符*数组的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])