monkey__ 发表于 2022-8-20 01:44:43

关于数组长度获取的问题求助

#include <stdio.h>

void reverseArray(int a[])
{
      int arrLength = sizeof(a)/sizeof(int); //这里一直arrLength是2,百思不得其解。。。。
      int tmp = 0;

                for (int i = 0; i < arrLength/2; i++)
                {
                        printf("%d - %d\n", a, a);
                        tmp = a;
                        a = a;
                        a = tmp;
                }

                for (int i = 0; i < arrLength; i++)
                {
                        printf("%d\n", a);
                }
}


int main()
{

      int a = {1,2,3,4,5};
      reverseArray(a);

      return 0;

}

上面reverseArray中数组长度获取始终得不到预期值,麻烦帮忙看下小弟哪里出错了 = - 。

wp231957 发表于 2022-8-20 05:25:39

听没听过数组自动降为指针这句话

jackz007 发表于 2022-8-20 07:57:17

本帖最后由 jackz007 于 2022-8-20 09:49 编辑

         a 是常数指针,对于 64 位的程序而言,每个指针占用 8 个字节,而每个 int 则占用 4 个字节,所以,计算结果是 2。
         你不可以用这种方式来获取数组的元素个数,必须为函数增加一个整型参数 5,用以显式告诉函数,数组 a 含有 5 个元素。当然,也可以为 a 多定义出一个元素,专门用于传递元素数量,例如,定义 a 的容量为 6,让 a = 5,为元素个数,a ~ a 为 5 个数组元素,这样,你也可以不用为函数新增变量参数。

陈尚涵 发表于 2022-8-20 08:25:46

数组本身是指针,如果使用vector就正确了
建议在参数里加一个len或n表示数组的长度

临时号 发表于 2022-8-20 09:41:01

数组传入函数时其实传入的是指针,因为直接传入数组的成本太大了
其实你完全可以改成void reverseArray(int *a),因为a就是指针

螃谢本谢 发表于 2022-8-20 10:20:48

{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}

桃花飞舞 发表于 2022-8-20 16:30:43

#include <stdio.h>

void reverseArray(int *a, int n)
{
      int tmp = 0;

                for (int i = 0; i < arrLength/2; i++)
                {
                        printf("%d - %d\n", a, a);
                        tmp = a;
                        a = a;
                        a = tmp;
                }

                for (int i = 0; i < arrLength; i++)
                {
                        printf("%d\n", a);
                }
}


int main()
{

      int a = {1,2,3,4,5};

      reverseArray(a,sizeof(a)/sizeof(int) );

      return 0;

}
我改了一下,上来这样应该没问题,要不你编译下。
int arrLength = sizeof(a)/sizeof(int); //这里一直arrLength是2,百思不得其解。。。。
我觉得arrLength的值在函数void reverseArray(int a[])里面应该是1,我运行了下也是1,不是你说的2
记着一维数组是用int *a来接收的就可以了,函数形参是void reverseArray(int *a,int n)//int *a,接受数组的首元素的地址, n数组中的元素的个数

zhangjinxuan 发表于 2022-9-12 17:37:34

我猜到了你的系统是64位,因为函数传入数组并非整个数组传过去,而是传入数组首地址(指向数组第一个元素的地址),所以sizeof(a)是8或4

cjgank 发表于 2022-9-14 09:09:34

当指针作为参数传入函数,sizeof()无法计算大小,如果需要用到指针长度,请将指针长度作为形参传入

两手空空儿 发表于 2022-9-14 11:11:07

本帖最后由 两手空空儿 于 2022-9-14 11:13 编辑

void reverseArray(int a[])
{
      int arrLength = sizeof(a)/sizeof(int); //这里一直arrLength是2,百思不得其解。。。。
子函数中a只是一个int型指针,就只是一个int指针,这里的[]不起数组的作用,是把a变成了一个指针,int a[] 等同于 int *a,电脑只知道从这里开始,不知道到哪里结束,sizeof(a)只能得到一个指针的长度,
a这个指针就看程序内怎么用, a[]这样用就是一个一维数组,a[][]这样用就是一个二维数组
像7楼那样再传一个参数就能很好的解决这个问题了

jhanker 发表于 2022-9-14 11:43:48

jackz007 发表于 2022-8-20 07:57
a 是常数指针,对于 64 位的程序而言,每个指针占用 8 个字节,而每个 int 则占用 4 个字节,所以 ...

同意,反正数组名是一个指针,不同编译系统长度不定,就像楼上说的

ExiaGN001 发表于 2022-9-14 20:53:29

本帖最后由 ExiaGN001 于 2022-9-14 20:54 编辑

传入reverseArray的a 是
int* a
而非
int a[]
假定32位系统,则
sizeof(int *)=4
sizeof(int)=2
4/2确实是2

解决:
#include <stdio.h>

void reverseArray(int *a,int arrLength)
{
      int tmp = 0;
                for (int i = 0; i < arrLength/2; i++)
                {
                        printf("%d - %d\n", a, a);
                        tmp = a;
                        a = a;
                        a = tmp;
                }
                for (int i = 0; i < arrLength; i++)
                {
                        printf("%d\n", a);
                }
}
int main()
{
      int a = {1,2,3,4,5};
      reverseArray(a,sizeof(a)/sizeof(int) );
      return 0;

}
页: [1]
查看完整版本: 关于数组长度获取的问题求助