如何将数组传入sizeof()?兼析(int[])强制转换数组的原理
关于C语言复合字面量与数组长度计算的问题解答
1. 为什么(int[]) {1,2,3}能生效?
这不是强制转换,而是C99标准引入的复合字面量语法:
- 字符串字面量
"abc"本质是一个匿名char数组,编译器会自动将其转换成指向数组首元素的指针,所以char *arr = "abc"能直接生效。 - 但单独的
{1,2,3}不是合法表达式,无法直接赋值给指针。而(int[]) {1,2,3}的写法会创建一个匿名int数组(元素为1、2、3),这个数组会自动转换成指向首元素的指针,因此可以赋值给int *arr。
简单来说,这个语法是帮你临时创建了一个匿名数组,再转成指针供变量使用。
2. 如何用sizeof()正确获取元素个数?
问题出在arr是指针类型,sizeof(arr)得到的是指针的字节数(比如32位系统是4,64位是8),而非数组总字节数。要正确计算,得直接针对数组本身操作:
- 方法一:直接对复合字面量计算
int n = sizeof((int[]) {1,2,3}) / sizeof(int); - 方法二:将复合字面量赋值给数组变量(而非指针)
这里int arr[] = (int[]) {1,2,3}; int n = sizeof(arr) / sizeof(int);arr是数组类型,sizeof(arr)会返回数组总字节数,除以单个int的字节数就能得到元素个数。
如果已经把数组转成指针,就无法通过sizeof获取长度了,只能手动记录元素数量。
内容的提问来源于stack exchange,提问作者noname delete
相关产品推荐
相关产品推荐

