繁体   English   中英

在不使用sizeof的情况下查找数组的大小

[英]Find size of array without using sizeof

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

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个int数组的指针。 *取消引用它会为您提供随后的数组。 由于此数组用于加法表达式( - ),因此它会衰减到指向其第一个元素的指针。 表达式中的arr也是如此。 所以你减去指针,一个指向arr后面不存在的元素,另一个指向arr的第一个元素。 这给你100。

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

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

通常(根据视觉工作室),用于阵列&arr是相同arr ,其返回我们的函数的起始基地址。

(&arr)[0]只是&arrarr

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

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

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

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

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

(char*)N-(char*)P给出NP之间有多少个字符。 由于每个字符的大小为1字节,因此上述结果给出了字节数PN (等于以字节为单位的数组大小)。

同样, (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<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,所以......大小在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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM