在C中不使用sizeof查找数组的大小
我正在寻找一种方法来在C中查找数组的大小而不使用C中的sizeof
,我找到了以下代码:
int main () { int arr[100]; printf ("%d\n", (&arr)[1] - arr); return 0; }
任何人都可以请你解释一下它是如何工作的?
&arr
是指向100个int
的数组的指针。
[1]
表示“添加指向的东西的大小”,这是一个100个int
的数组。
所以(&arr)[1]
和arr
之间的差异是100 int
s。
(请注意,此技巧仅适用于sizeof
无论如何都会工作的地方。)
&arr
为您提供指向数组的指针。 (&arr)[1]
相当于*(&arr + 1)
。 &arr + 1
为您提供指向arr
100个整数数组的指针。 用*
取消引用它会为您提供随后的数组。 由于此数组用于加法表达式( -
),因此它会衰减到指向其第一个元素的指针。 表达式中的arr
也是如此。 所以你减去指针,一个指向arr
后面不存在的元素,另一个指向arr
的第一个元素。 这给你100。
但它不起作用。 %d
用于int
。 指针差异会返回ptrdiff_t
而不是int
。 您需要将%td
用于ptrdiff_t
。 如果你对printf()
说谎你传递给它的参数的类型,你会得到当之无愧的未定义行为。
编辑 : (&arr)[1]
可能会导致未定义的行为。 这还不完全清楚。 如果有兴趣,请参阅下面的评论。
通常(根据visual studio),对于数组&arr
相同 ,它返回函数的起始基址。
(&arr)[0]
只是&arr
或arr
例如:它将返回一些地址: 1638116
现在, (&arr)[1]
意味着我们开始从弹跳中访问数组意味着下一个数组或当前数组大小的下一个段(前面100个)。
例如:它将返回一些地址: 1638216
现在,减去(&arr)[1] - (&arr)[0]=100
&variable
给出&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)
数组的(size of array in bytes)/(size of each element in the array in bytes)
#include 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,所以……大小在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; }