在C中不使用sizeof查找数组的大小

时间:2013-04-15 15:25:33

标签: c arrays sizeof

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

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

任何人都可以请你解释一下它是如何运作的?

6 个答案:

答案 0 :(得分:24)

&arr是指向100 int s。

的数组的指针

[1]表示“添加指向的东西的大小”,这是一个100 int s的数组。

因此(&arr)[1]arr之间的差异为100 int s。

(请注意,此技巧仅适用于sizeof无论如何都会工作的地方。)

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:1)

一般情况下(根据视觉工作室), 对于数组 &arrarr 相同,它返回函数的起始基址。

(&arr)[0]只是&arrarr

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

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

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

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

答案 3 :(得分:0)

&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)

#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;

}

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

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