首页 > 其他分享 >C语言的sizeof()计算数组参数结果错误

C语言的sizeof()计算数组参数结果错误

时间:2023-02-12 11:22:37浏览次数:43  
标签:arr int len C语言 数组 test sizeof

在C语言中我们计算数组大小会使用sizeof(arr)/sizeof(arr[0])

sizeof(arr) : 整个数组占用的字节数;

sizeof(arr[0]) : arr[0]占用的字节数;

但是我们有时会遇到这种情况
数组作为参数,求出的数组大小与实际大小不一致。

先看代码

void test(int* arr){
   int len=sizeof(arr)/sizeof(arr[0]);
   printf("%d",len);
}
int main()
{
   int arr[3] = {1, 2, 4};
   test(arr);
   return 0;
}

理论输出结果应当为3,可是结果却是2。

哪里出了问题?

原因是数组作为函数参数传递后,会退化为指针,指针类型作为存储数据地址的变量类型,其大小受计算机总线制约,而64位系统指针大小位8字节,故sizeof(指针)结果为8。

8bit为1字节(1B),
同理,32位系统指针变量大小为4B

修改代码

void test(int* arr){
   int len=sizeof(arr)/sizeof(arr[0]);
   printf("%d / %d = %d",sizeof(arr),sizeof(arr[0]),len);
}
int main()
{
   int arr[3] = {1, 2, 4};
   test(arr);
   return 0;
}

所以很多算法的数组参数都会指定一个参数n指明数组大小。

重新修改代码

void test(int* arr,int n){
   for (int i = 0; i < n; i++)
   {
      printf("%d\n",arr[i]);
   }
   
}
int main()
{
   int arr[3] = {1, 2, 4};
   test(arr,3);
   return 0;
}

标签:arr,int,len,C语言,数组,test,sizeof
From: https://www.cnblogs.com/cnleika/p/17113459.html

相关文章

  • C语言填空:鸡兔同笼 判断非法输入
    #include<stdio.h>//鸡兔同笼问题,兔子和鸡同处一个笼子,头的数量为x,脚的数量为y,输人x和y,输出鸡多少只兔子多少只(如输人错误则输出“输入非法!”)。main(){intx,y,j......
  • C语言填空:选票统计
    #include<stdio.h>//3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输人被选人的名字,最后输出各人得票结果。【1】structperson{charname[20]......
  • C语言填空:英文单词首字母变大写
    #include<stdio.h>【1】//输人一行字符串,由英语单词和若干空格组成,将每个单词的第一个字母不是大写的变为大写并输出。main(){charch[100];inti=0,n=0;......
  • C语言填空:杨辉直角三角形
      //以下程序的输出结果如图所示,每行的最左和最右元素均为1,//中间的每个元素等于其左上方和上方两个元素之和,每个元素的宽度为4且左对齐。请完成程序填空。#includ......
  • C语言填空:输出数字组成的三角形
      //.要输出图形tu.png样式,请完善程序。#include<stdio.h>main(){inti,j,k;for(i=1;【1】;i++){for(j=1;【2】;j++)【3】;......
  • C语言填空:最低分 最高分
    //输入十个评委的打分,去掉一个最高分,去掉一个最低分,求平均分。#include<stdio.h>main(){intmark,max,min,sum=0,i;【1】;for(i=1;i<......
  • C语言填空:保持原有顺序
    //已有一个已经排好序的序列,输入一个数,将其插入到该序列中,使之仍然保持有序。#include<stdio.h>main(){inta[20]={3,7,10,12,18,20};inti,j,t;s......
  • C语言填空:本年第几天
    //输入一个日期,输出是本年的第几天。#include<stdio.h>main(){intyear,month,day,i;scanf("%d%d%d",&year,&month,&day);for(i=1;i<【1】;i++)......
  • C语言:任意10个浮点数从小到大排序
    //冒泡排序:将任意10个浮点数从小到大排序#include<stdio.h>main(){floata[10],t;inti,j,k,b;for(i=0;i<=9;i++)scanf("%f",&a[i]);for(......
  • C语言:指针 运行结果
    #include<stdio.h>//程序运行结果:【1】int*f(int*x,int*y){if(*x<*y)returnx;elsereturny;}main(){inta=7,b=8,*p=&a,*q=&b,*r;r=f......