我正在寻找一种无需使用即可在 C 中查找数组大小的方法sizeof
,我找到了以下代码:
int main ()
{
int arr[100];
printf ("%d\n", (&arr)[1] - arr);
return 0;
}
谁能向我解释一下它是如何工作的?
&arr
int
是一个指向 100 s数组的指针。
[1]
意思是“添加指向的东西的大小”,它是一个 100 sint
的数组。
所以 和 之间的差(&arr)[1]
是arr
100int
秒。
(请注意,此技巧仅适用于sizeof
本来可以工作的地方。)
&arr
给你一个指向数组的指针。(&arr)[1]
相当于*(&arr + 1)
。&arr + 1
给你一个指向后面的 100 个整数数组的指针arr
。取消引用它*
会为您提供随后的数组。由于该数组用于加法表达式 ( -
),因此它衰减到指向其第一个元素的指针。同样的情况也发生arr
在表达式中。所以你减去指针,一个指向不存在的元素arr
,另一个指向arr
. 这给你100。
但它不起作用。%d
用于int
. 指针差异返回你ptrdiff_t
而不是int
。您需要%td
使用ptrdiff_t
. 如果你printf()
对传递给它的参数类型撒谎,你会得到当之无愧的未定义行为。
编辑:(&arr)[1]
可能会导致未定义的行为。这并不完全清楚。如果有兴趣,请参阅下面的评论。
通常(根据 Visual Studio),对于一个数组&arr
,arr
它返回我们函数的起始基地址。
(&arr)[0]
只不过是&arr
或arr
例如:它将返回一些地址:1638116
现在,(&arr)[1]
意味着我们开始从反弹中访问数组意味着下一个数组或当前数组大小的下一个段(提前 100 个)。
例如:它将返回一些地址:1638216
现在,减去(&arr)[1] - (&arr)[0]=100
&variable
给出变量的位置(称它为P
)
&variable + 1
给出变量旁边位置的地址。(称它为N
)
(char*)N-(char*)P
N
给出和之间有多少个字符P
。由于每个字符都是 1 字节大小,所以上面的结果给出了字节数P
和N
. (等于数组的大小,以字节为单位)。
同样,
(char*) (a+1)-(char*)a;
给出数组中每个元素的大小(以字节为单位)。
所以数组中的元素个数=(size of array in bytes)/(size of each element in the array in bytes)
#include<stdio.h>
int main()
{
int a[100];
int b = ((char*)(&a+1)-(char*)(&a));
int c = (char*) (a+1)-(char*)a;
b = b/c;
printf("The size of array should be %d",b);
return 0;
}
int arry[6]={1,2,3,4,5,6} //让数组元素为 6,所以... size in byte = (char*)(arry+6)-(char *)( arry)=24;
int main ()
{
int arr[100];
printf ("%d\n", ((char*)(&arr+1) - (char*)(&arr))/((char*) (arr+1) -(char*) (arr)));
return 0;
}