C语言程序中,子函数使用sizeof函数计算形参数组提示错误.

sizeof解析 关于sizeof的一些疑问 阅读详情

C语言程序中,子函数使用sizeof函数计算形参数组提示错误:

问题描述:

在子函数中调用sizeof计算main函数中将实参数组arr[]给形参后的x[]的元素个数,出现错误.原本应该9个,实际计算出来2个.
代码:

#include <stdio.h>

int Calarrlen(int arr2[])
{
    int sz = sizeof(arr2)/sizeof(arr2[0]);
    return sz;
}

int main()
{
    int arr1[] = {1,2,3,4,5,6,7,8,9,10};
    int a = Calarrlen(arr1);
    printf("%d\n",a);
    return 0;
}

原因分析:

因为在实参赋值给形参的时候并不是将arr1全部元素复制到arr2中,为了节省计算机的内存,arr2类似于指针.实际中,是将arr1的首个元素的地址赋值给arr2,所以sizeof(arr2)计算的是arr1首个元素的地址长度,所以为8,而每个元素的长度为4,最终计算出来就为2.

解决方案:

在函数调用之前,在主函数中就进行数组的个数/长度计算,如需使用,将个数/长度的值以实参的形式赋值给调用函数即可解决这个问题.或者可以在调用函数中使用新的数组来接收arr2,不过就是程序会比较繁琐.

C语言指针与函数传参 指针与函数传参普通变量与函数形参数组作为函数形参结构体变量作为函数形参传值调用和传址调用输入型参数和输出型参数函数的形参和返回值函数传参中使用const指针函数如何向外部返回多个值总结 普通变量与函数形参 函数传参时普通变量作为参数,形参和实参名字可以相同也可以不同,实际上都是用实参来代替形参的。 在子函数的内部,形参值等于实参。原因是函数调用时把实参的值赋给了形参。 这种就叫做传值调用。 数组作为函数形参 数组名作为形参传参的时候,实际传递的不是整个数组,而是数组的首元素的首地址。在子函数内部,传进来的数 阅读详情

相关推荐

实践指南——【SPSS操作解析】线性混合效应模型在重复测量数据中的应用

本文详细解析了线性混合效应模型在重复测量数据分析中的应用,并提供了SPSS操作指南。文章阐述了该模型如何通过区分固定效应与随机效应,有效处理数据非独立性和缺失值问题,从而获得更可靠的统计推断。

oo7890的博客 550

c++ 中sizeof 与数组形参

c++ 中sizeof 与数组形参 sizeof,返回表达式或类型名所占用的字节数。 int x[10]; int* p = x; cout << sizeof(x) << endl; //40,结果为数组占用的总空间 cout << sizeof(*x) << endl; //4,结果为数组类型占用的空间 cout << sizeof(p) << endl; //4,结果为指针占用的空间 cout <<

MAXXD的博客 1077

01、【solidworks】windosws正在配置solidworks问题及注册表未卸载干净问题解决

windosws正在配置solidworks问题及注册表未卸载干净问题解决

qq_740388770的博客 2万+

c语言sizeof报错,关于C中sizeof(class)用法引发的错误

当我在C中编译我的项目时,MSVC抛出以下错误:error #94: the size of an array must be greater than zero在执行sizeof时,在以下行中抛出错误:if (sizeof (MyNamespace::MyClass) == 60)因此定义了MyClass:class MyClass: public ParentClass{public:MyCl...

weixin_39743824的博客 1063

格拉姆角场(GAF)实战:用Python实现时间序列图像化处理

本文深入解析了格拉姆角场(GAF)技术,这是一种将一维时间序列转化为二维图像特征的方法,以便利用卷积神经网络(CNN)等图像模型进行深度分析。文章通过Python实战代码,详细演示了GASF和GADF两种核心转换的实现过程,并探讨了其在时序数据分类任务中的应用,为故障预警、金融模式识别等场景提供了强大的图像驱动分析视角。

weixin_29079671的博客 272

28377D Bootloader

架构

a6100309120的博客 6011

C语言中sizeof操作符的坑

前言 今天在寝室看书时,被室友问了个关于sizeof操作符的问题,没想到就掉坑里去了,特此记录一下,免得以后“再次踏入同一条河流” 正文 先来看一段代码 #include <stdio.h> int main() { int i = 1; printf("%d\n",sizeof(i++)); printf("%d\n",i); return 0; } 请问该段代码的输出是什么? 首先sizeof是用于求数据类型内存大小的运算符,在VS中i

Edison's 小宇宙 1062

Selenium实战:突破反爬,自动化抓取国家知识产权局专利数据

网络爬虫是数据采集的核心技术,其原理是通过程序模拟浏览器行为,自动访问网页并提取结构化信息。在数据驱动决策的今天,高效获取公开数据对市场分析、技术调研和竞争情报至关重要。然而,面对广泛应用的JavaScript动态渲染和反爬虫机制,传统的静态页面抓取方法往往失效。Selenium作为浏览器自动化工具,通过驱动真实浏览器执行JavaScript,能够有效绕过前端反爬,实现“可见即可得”的数据抓取,在需要与页面进行复杂交互或处理动态内容的场景中价值显著。本文以【专利数据】抓取为例,结合【Selenium】工具,

weixin_33881140的博客 392

使用sizeof时,编译提示incomplete type is not allowed的解决办法

程序:memset(BLUE_TX_BUF, 0, sizeof(BLUE_TX_BUF)); 编译时候出现的错误如下: ..\Src\deviceJob.c(645): error: #70: incomplete type is not allowed 发现声明BLUE_TX_BUF时,是这样的,extern uint8_t BLUE_TX_BUF[]; 原因: 原来是用ex...

happygrilclh的博客 7562

MATLAB并行开不了的解决办法

在服务器上新安装了MATLAB 2013b,在开并行计算的时候出现了下列问题 经过在网上搜多这个问题,我感觉这个问题应该是安装的时候的验证问题或者激活不成功之类的。注意其中有一句validate the profile ‘local’ in the Cluster Profile Manager.在matlab官网上找到了设置Cluster Manager的教程,如下 parallel>

sinat_36713319的博客 5987

运维工程师面试整理-安全常见安全漏洞及修复

暴露在互联网的服务和端口可能会成为攻击者的目标,例如开放的SSH、FTP、Telnet等。:攻击者通过注入恶意脚本,使其在其他用户的浏览器中执行,从而窃取用户信息或劫持用户会话。:通过插入恶意SQL代码,攻击者可以操纵应用程序的数据库查询,执行未授权的数据库操作。:展示你对新兴安全威胁和防护技术的了解和学习能力,如零信任架构、基于AI的安全分析等。在不同的服务器或沙盒环境中处理和存储上传的文件,避免在Web根目录下保存可执行文件。采用安全框架和标准(如OWASP、NIST),确保系统和应用的安全合规性。

不务正业的猿 922

c语言sizeof数组作为函数形参,解析sizeof, strlen, 指针以及数组作为函数参数的应用...

代码如下所示:typedef struct st_test{int id;char *pName;char class[10];}Student;void fn(Student *pStud) {pStud->id = 10;pStud->pName = "Tom Simith";strcpy(pStud->class, "Class 1");printf("sizeof(pSt...

weixin_34207964的博客 454

ESP32-C3入门教程 环境篇③——VS Code IDE快速入门

文章目录一、安装Visual Studio Code二、安装扩展三、配置ESP-IDF 插件四、创建工程五、配置工程5.1 选择目标芯片5.2 项目配置六、编译工程七、固件分析七、固件下载八、串口日志九、单步调试 一、安装Visual Studio Code 下载并安装Visual Studio Code 二、安装扩展 左侧扩展 搜索espressif 点击安装 三、配置ESP-IDF 插件 按下F1按键 输入configure esp-idf extension EXPRESS,如果你

8301

揭秘C语言数组参数之谜:为什么sizeof失效,以及如何补救

掌握C语言中数组作为函数参数的长度处理技巧,解析为何sizeof失效及应对方法。适用于函数传参场景,通过指针结合显式传长获取真实长度,提升程序可靠性。方法简单高效,值得收藏

DevPath的博客 973

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C/C++刁钻问题各个击破之细说sizeof

摘要: Sizeof的作用非常简单:求对象或者类型的大小。然而sizeof又非常复杂,它涉及到很多特殊情况,本篇把这些情况分门别类,总结出了sizeof的10个特性: (0)sizeof是运算符,不是函数; (1)sizeof不能求得void类型的长度; (2)sizeof能求得void类型的指针的长度; (3)sizeof能求得静态分配内存的数组的长度! (4

u014468600的专栏 730

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【C语言程序设计】【C语言】考试复习,其实你什么也不会。

1、下列循环语句中有语法错误的是 __。 A) while(x=y) 5; B) while(0); C) do 2; while(x==b); D) do x++ while(x==10); 2、表达式 sizeof(double)是 __。 A) 函数调用 B) double 型表达式 C) int 型表达式 D) 非法表达式 3、列竖式计算下列表达式的值,结果用十进制表示。 4&2 2|6 (-6)^7 8<<2 (a=-9)>>2 4、...

weixin_42302504的博客 971

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C语言的限制

C语言的一些语法限制

m0_74859205的博客 603

C语言基础——数组传参

我们发现在函数内部是没有正确获得数组的元素个数,其原因在与数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址,所以sizeof(arr) 计算的是⼀个地址的⼤⼩(4/8字节)。arrin[0][1],arrin[0][2],arrin[0][3],而第5个字符串则被解释为arrin[1][0]而不是arrin[0][4]。如此一来,我们便知道了形参数组下标引用操作符中的数字,决定了当形参在得到了实参数组的首的地址后,如何对后续的内容进行解释,这就是。

classtino的博客 510

【C语言内存安全关键】:数组参数长度传递错误导致崩溃的6大案例分析

解决C语言数组传参常见崩溃问题,深入剖析C语言中数组作为函数参数的长度处理机制。涵盖越界访问、动态计算长度、指针与大小传递等6大典型场景,提供安全编码方案。掌握内存安全关键技巧,值得收藏。

FastSolve的博客 778

C 语言中关于通过形参传递数组的长度计算的一些思考

C 语言中关于通过形参传递数组的长度计算的一些思考 一 背景 学习 C 语言的过程中,计算数组的长度经常会碰到。在字符型的数组中我们可以使用 strlen() 来获取当前数组的长度,对于其他类型的数组,这个方法就不适用了。由于经常会遇到计算数组长度的问题,经过思考,考虑通过一个函数来实现数组长度的计算。思路是这样的:通过形参将数组传递给长度计算函数,长度计算函数计算完成之后返回数组长度。但是在实际...

晨曦蜗牛 7894

sizeof运算符详细总结

sizeof运算符的系统总结标签:c/c++转自 http://blog.csdn.net/w57w57w57/article/details/6626840 简介   sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或者数据对象)的长度(即占用内存的大小,以byte为单位)。其中类型包含基本数据类型(不包括void)、用户自定义类型(结构体、类)、函数类型。数据对

hust_sheng的专栏 5万+

数组传参时为何sizeof失效

在C++函数中使用无法正确获取传入数组长度的根本原因是数组参数退化为指针。这是C++语言设计的历史遗留特性,理解这一机制对于编写正确的数组处理代码至关重要。最佳实践建议对于需要处理数组的函数,始终显式传递数组长度作为参数在新的C++项目中,优先使用或std::array替代原生数组如果必须使用原生数组,考虑使用模板函数来保留长度信息避免在函数内部尝试通过sizeof计算传入数组的长度这种理解不仅有助于避免常见的编程错误,也是深入理解C++类型系统和内存模型的重要一步。

weixin_60531055的博客 467

嵌入式 C 语言开发常见错误第一篇

常易忽视C开发时错误点,面试也容易出现的题目 break 1.一般我们用switch() { case () :执行该case条件的语句;break; default:;break; } 注意:break关键字,只能用于跳出最近那层循环语句(for ,while,do…while)或者switch语句,而不是if语句;看起来像很简单,但是到嵌套许多循环时,极其容易忽略。 sizeof(这是关键字,不是函数) sizeof作用是返回一个对象或者类型所占的内存字节数,对绝大多数编译器而言,返回值为无符号整形数

smallknow的博客 488

看完这篇文章一定弄懂C语言数组作为函数参数的用法

C语言数组作为函数参数 文章目录一:数组元素作为函数的实参二:数组名作为函数的实参关于数组作为函数参数调用的讨论关于函数定义的参数表的讨论获取二维数组的行和列更高维数组作为函数参数同二维数组类似参考文档 一:数组元素作为函数的实参 数组元素就是变量,与普通变量没有区别,将数组元素传送给形参,实现单向的值传递。 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。 因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变

weixin_40162095的博客 1万+

函数中使用sizeof(arr) / sizeof(arr[0])求数组长度不正确的原因

sizeof 计算数组长度不正确

weixin_42269472的博客 2497

C 语言中使用数组作为参数的函数

其参数列表中,int arr[]表示接收一个整型数组arr,这里数组的大小并未在参数声明中指定,这是因为在 C 语言中,当数组作为函数参数传递时,实际上传递的是数组的首地址,数组的大小信息并不会自动传递给函数。所以,为了让函数知道需要处理的数组元素个数,我们额外引入了一个参数int size,它用于明确告知函数数组的实际大小。在 C 语言的编程体系里,函数是模块化编程的核心元素,它能够将复杂的任务分解为一个个可管理的代码块,极大地提升了程序的可读性、可维护性以及代码的复用性。数组参数在函数中的应用背景​。

weixin_46296140的博客 700
上一篇: 本科毕业生,计划开始学习编程,希望能坚持下去!
下一篇: Unity实现按钮Button多功能(长按,双击)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值