homeskating 发表于 2022-10-10 14:42:36

为啥sizeof获得的数组长度为8

void get_array(int a);
void get_array(int a) {
        int i;
        printf("传入数组长度为%d\n",sizeof(a));//打印结果为8
}
int main() {
        int i;
        int a;
        for(i=0; i<5; i++) {
                printf("请输入%d个数\n",(i+1));
                scanf("%d",&a);
        }
        get_array(a);
        return 0;
}

jackz007 发表于 2022-10-10 14:54:50

本帖最后由 jackz007 于 2022-10-10 14:58 编辑

       传入函数 get_array(int a) 的参数 a 只是一个指针变量,sizeof(a) 只能获得变量 a (指针)本身所占用的内存空间,而并不是数组的,由于你的程序是 64 位的,一个指针占用 8 个字节,所以,sizeof(a) 的值就是 8。如果把代码编译成 32 位程序,那么,这个值便会是 4。
       所以,不可以在函数内用 sizeof() 来获取传入数组的元素数量,必须要想其它办法,比如,专门增加一个输入参数,或者,用数组的第一个元素进行传递等等。

homeskating 发表于 2022-10-10 21:46:15

jackz007 发表于 2022-10-10 14:54
传入函数 get_array(int a) 的参数 a 只是一个指针变量,sizeof(a) 只能获得变量 a (指针)本身 ...

感谢大佬,我这边还有个问题:
        int a={1,2,3,4,5};
        int i;
        printf("%d",sizeof(a));
这样打印的sizeof的值是20,按照8位的话应该是40,求解答

jackz007 发表于 2022-10-10 21:55:12

本帖最后由 jackz007 于 2022-10-10 22:00 编辑

homeskating 发表于 2022-10-10 21:46
感谢大佬,我这边还有个问题:
        int a={1,2,3,4,5};
        int i;


       通过 int a 定义的数组名 a 是和它所占用的空间进行绑定的,所以,a 不是一个变量,而是一块内存,例如,我们不可以以任何方法改变 a 的值,在 a 的有效作用域范围内,都可以根据 sizeof(a) 来确定数组 a 所占用的字节数,这一点和作为参数声明的函数参数 int b 是完全不同的,因为 b 是一个指针变量,不是一块内存本身。

人造人 发表于 2022-10-10 21:58:07

homeskating 发表于 2022-10-10 21:46
感谢大佬,我这边还有个问题:
        int a={1,2,3,4,5};
        int i;


因为在你现在的这个环境上,一个int是4个字节
5个int就是20个字节

jackz007 发表于 2022-10-11 00:31:48

本帖最后由 jackz007 于 2022-10-11 00:34 编辑

homeskating 发表于 2022-10-10 21:46
感谢大佬,我这边还有个问题:
        int a={1,2,3,4,5};
        int i;


      再举个例子
      int a={1,2,3,4,5} , * b = a ;
      printf("sizeof(a) = %d\n",sizeof(a));
      printf("sizeof(b) = %d\n",sizeof(b));
      在这个例子中,指针 b 指向了数组 a,可以通过 b 来访问 a,不仅如此,还可以使用和访问 a 完全一样的方式来访问 b,例如,b 就是 a,b 就是 a等等。但是,正如上面的代码所展示的结果那样,a 和 b 显然是存在本质区别的,a 代表数组本身,b 只是一个指针。在函数内使用 sizeof() 测试传入的数组大小,实际上得到的只能是一个指针的,而不可能是数组本身的大小。

homeskating 发表于 2022-10-11 10:24:05

jackz007 发表于 2022-10-11 00:31
再举个例子

      在这个例子中,指针 b 指向了数组 a,可以通过 b 来访问 a,不仅如此, ...

好的,感谢老哥,理解了
页: [1]
查看完整版本: 为啥sizeof获得的数组长度为8