17

我正在寻找一种无需使用即可在 C 中查找数组大小的方法sizeof,我找到了以下代码:

int main ()
{
    int arr[100];
    printf ("%d\n", (&arr)[1] - arr);
    return 0;
}

谁能向我解释一下它是如何工作的?

4

6 回答 6

25

&arrint是一个指向 100 s数组的指针。

[1]意思是“添加指向的东西的大小”,它是一个 100 sint的数组。

所以 和 之间的差(&arr)[1]arr100int秒。

(请注意,此技巧仅适用于sizeof本来可以工作的地方。)

于 2013-04-15T15:27:50.917 回答
12

&arr给你一个指向数组的指针。(&arr)[1]相当于*(&arr + 1)&arr + 1给你一个指向后面的 100 个整数数组的指针arr。取消引用它*会为您提供随后的数组。由于该数组用于加法表达式 ( -),因此它衰减到指向其第一个元素的指针。同样的情况也发生arr在表达式中。所以你减去指针,一个指向不存在的元素arr,另一个指向arr. 这给你100。

但它不起作用。%d用于int. 指针差异返回你ptrdiff_t而不是int。您需要%td使用ptrdiff_t. 如果你printf()对传递给它的参数类型撒谎,你会得到当之无愧的未定义行为。

编辑(&arr)[1] 可能会导致未定义的行为。这并不完全清楚。如果有兴趣,请参阅下面的评论。

于 2013-04-15T15:34:57.920 回答
1

通常(根据 Visual Studio),对于一个数组&arrarr它返回我们函数的起始基地址。

(&arr)[0]只不过是&arrarr

例如:它将返回一些地址:1638116

现在,(&arr)[1]意味着我们开始从反弹中访问数组意味着下一个数组或当前数组大小的下一个段(提前 100 个)。

例如:它将返回一些地址:1638216

现在,减去(&arr)[1] - (&arr)[0]=100

于 2015-02-09T19:04:03.697 回答
0

&variable给出变量的位置(称它为P
&variable + 1给出变量旁边位置的地址。(称它为N

(char*)N-(char*)PN给出和之间有多少个字符P。由于每个字符都是 1 字节大小,所以上面的结果给出了字节数PN. (等于数组的大小,以字节为单位)。

同样, (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;

}
于 2015-03-11T11:02:55.690 回答
0

int arry[6]={1,2,3,4,5,6} //让数组元素为 6,所以... size in byte = (char*)(arry+6)-(char *)( arry)=24;

于 2018-06-29T19:52:10.207 回答
-2
int main ()
{
  int arr[100];
  printf ("%d\n", ((char*)(&arr+1) - (char*)(&arr))/((char*) (arr+1) -(char*) (arr)));
  return 0;
}
于 2015-10-04T08:17:57.020 回答