weixin_44810777
phantomas
采纳率100%
2019-03-28 14:20 阅读 639

不用SIZEOF求数组大小的问题

我在论坛上找到了不用sizeof求数组大小的方法,但是如果我将这个办法封装
成函数,返回的数字完全是错的,不知道为什么,求仙人指路

int mysizeof(int arr[]);
int mysizeof(int arr[])
{
    int*pp1=*(&arr+1);
    int pp2 = pp1-arr;
    return pp2;
}

int main()
{
    int a[] = {1,2,3,4,5,6,7};
    int * p = *(&a+1);
    int p2 = p-a;
    int pp = mysizeof(a);

    printf("%p\t%p\t\n",a+1,p);
    printf("%d",p2);
    printf("\n********************************************\n");
    printf("%d",pp);
    return 0;
}

为什么这个函数不能封装啊,自定义函数中的值到底发生了什么?
在线等
但是同样的写法在main里为什么能够正确计算?是不是因为传递进函数之后arr是一个副本,在main中的时候&arr的类型是具有长度属性的,+1之后就移动了整个数组的长度,但是在自定义函数中arr只是一个指向main函数中数组首元素的地址的一个指针,而不具备长度属性,或者说长度属性退化掉了?所以在自定义函数中&arr+1不能明确知道指针具体偏移了多少,是这个意思吗?还是不太明白

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • 已采纳
    lpf150 迷糊小妖 2019-03-28 19:21

    int arr[]是int* arr, &arr+1 是在arr指针栈地址的基础上做了1的偏移, 也就是&arr+1*_sizeof(int)后的地址, *(&arr+1)的内容就未可知了.
    mysizeof函数可以做如下改下:

    int(*p)[7] = (int(*)[7])arr;

    int * pp1 = * (p+1) ;

    int pp2 = pp1 - (int*)p;

    return pp2;

    所以, 函数对数据的长度是必需的

    点赞 评论 复制链接分享
  • mym2018 mym2018 2019-03-28 14:36

    int * p1= *(&a+1);
    int p2 = p1-a;参数改下名图片说明

    点赞 评论 复制链接分享
  • Moon_X_code _MoonX_ 2019-03-28 16:43

    int*pp1=*(&arr+1);
    arr数组名 即是一个地址 &arr???对地址取址???

    点赞 评论 复制链接分享
  • wusuobuwei_1 wusuobuwei_1 2019-03-29 11:13

    函数main():
    int a[] = {1,2,3,4,5,6,7};
    int * p = *(&a+1);
    int p2 = p-a;
    其中 &a 为指向数组的指针,&a+1指向下一个数组, p-a获取数组的大小(int数)。

    函数int mysizeof(int arr[]):
    int*pp1=*(&arr+1);
    int pp2 = pp1-arr;
    其中arr是一个指针变量即int* arr,
    &arr+1获取到下一个int地址,
    int*pp1=*(&arr+1)为解引用该地址,并将该地址指向的值(int类型,未知值)赋予指针pp1(指针类型),此时变量pp1代表的地址是个未知值,
    pp1-arr为pp1代表的地址(未知值)减去arr代表的地址(数组首地址)。
    以上。

    点赞 评论 复制链接分享

相关推荐