嵌入式C基础——ARRAY_SIZE使用以及踩坑分析

本期主题:
讲解ARRAY_SIZE的作用以及定义,还有一个踩坑分析


往期链接:

  • 数据结构系列——先进先出队列queue
  • 数据结构系列——栈 stack
  • Linux内核链表
  • 零长度数组的使用
  • inline的作用

目录

  • 1. ARRAY_SIZE定义及作用
  • 2.踩坑分析


1. ARRAY_SIZE定义及作用

ARRAY_SIZE 是一个常见的宏定义,用于计算数组的大小(元素数量)。这个宏定义通常用于C和C++语言中,它的定义如下:

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))

ARRAY_SIZE 宏定义的作用是利用 sizeof 运算符来获取数组 arr 的总字节数,然后除以数组中第一个元素的字节数,从而得到数组的元素数量。这样做的原因是在C和C++中,除了动态分配的内存,编译器都能在编译时计算出数组的大小。

使用 ARRAY_SIZE 宏定义时,你只需将数组名作为参数传递给它,它就会返回该数组的元素数量。

看一个具体的例子:

#include "main.h"#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))struct my_str test_str_1[] = {{"a", 1},{"b", 2},{"c", 3},
};struct my_str test_str_2[] = {{"d", 1},{"e", 2},{"f", 3},
};int main(void)
{printf("array1 size is %ld\n", ARRAY_SIZE(test_str_1));printf("array2 size is %ld\n", ARRAY_SIZE(test_str_2));return 0;
}

上述代码会打印结果是 3

2.踩坑分析

想着把上面的代码优化一下,加上一个函数,输入的参数是my_str的指针,从而实现打印size,具体代码实现如下:

void print_size(struct my_str *str)
{printf("print_size, size is %ld\n", ARRAY_SIZE(str));
}int main(void)
{printf("array1 size is %ld\n", ARRAY_SIZE(test_str_1));printf("array2 size is %ld\n", ARRAY_SIZE(test_str_2));print_size(test_str_1);print_size(test_str_2);return 0;
}

最终发现结果是:

$ ./a.out
array1 size is 3
array2 size is 3
print_size, size is 0
print_size, size is 0

后面两个函数输出的size为0是不符合预期的

经过分析后发现:

  1. 在C语言中,函数的参数传递是通过值传递的方式进行的。当你传递一个指针给函数时,实际上传递的是指针的副本,而不是指针本身指向的内存地址中的内容
  2. 因此,在函数中使用了sizeof操作符,它也只是计算了指针的大小,而不是指针所指向的数组的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器ECS u1实例ecs.u1-c1m2.large性能测评

阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

Ubuntu下udp通信

一、知识准备阶段 socket是什么?套接字是什么? https://blog.csdn.net/m0_37925202/article/details/80286946 Socket程序从Windows移植到Linux下的一些注意事项 sockaddr和sockaddr_in详解 bzero和memset函数 函数原型:void bzero&…

深入理解两个常用的Python技巧

1. 引言 只需简单搜索一下,就很容易获得许多试图告诉我们关于 Python 技巧的文章。这些技巧要么更 “Pythonic”,要么能让我们的程序更快。这些文章并没有错,因为大多数技巧都非常有用。事实上,我自己也写过很多这类文章。 然而…

蓝桥杯 java 承压计算

题目: 思路: 1:其中的数字代表金属块的重量(计量单位较大) 说明每个数字后面不一定有多少个0 2:假设每块原料的重量都十分精确地平均落在下方的两个金属块上,最后,所有的金属块的重量都严格精确地平分落在最底层的电子…

多维数组和交错数组笔记

1.) 关于数据的几个概念: Rank,即数组的维数,其值是数组类型的方括号之间逗号个数加上1。 Demo:利用一维数组显示斐波那契数列F(n) F(n-1) F(n-2) (n >2 ),每行显示5项,20项. static void Main(string[] args){int[] F n…

Week4-LeetCode

1997.访问完所有房间的第一天 分析题目,可以得到两个要点: 1. 第一次到达房间i1需要到达房间i两次 2. 到达当前房间i两次需要从nextVisit[i]再到i一次 设f(i)为第一次到达房间i需要的时间,则第一次到达 i1房间需要的时间为: f(…

http响应练习—在服务器端渲染html(SSR)

一、什么是服务器端渲染(SSR) 简单说,就是在服务器上把网页生成好,整个的HTML页面生成出来,生成出的页面已经包含了所有必要的数据和结构信息,然后直接发给浏览器进行展现。 二、例题 要求搭建http服务&a…

slowhttp攻击漏洞原理解析和防御,以及LiqunKit 综合漏洞利用工具详细使用

slowhttp攻击漏洞原理解析和防御,以及LiqunKit 综合漏洞利用工具详细使用。 Slowhttp攻击是一种拒绝服务(DoS)攻击,它利用了HTTP协议的一些特性来耗尽服务器资源,导致服务器对正常请求的响应变慢或无法响应。这种攻击的特点是长时间占用服务器的连接,而不是发送大量流量…

JSQLParserException异常

前言 SQL中加入了租户字段&#xff0c;报这个错&#xff0c;可以查出数据&#xff0c;但是不多&#xff1b;SQL检查无问题 解决 原因一 引入新的SQL解析器检查解析SQL&#xff0c;与mybatis多租户无关 参考 <!--jsqlparser版本太低也无法解析&#xff0c;如2.0--> &…

2024 年高效开发的 React 生态系统

要使用 React 制作应用程序&#xff0c;需要熟悉正确的库来添加您需要的功能。例如&#xff0c;要添加某个功能&#xff08;例如身份验证或样式&#xff09;&#xff0c;您需要找到一个好的第三方库来处理它。 在这份综合指南中&#xff0c;我将向您展示我建议您在 2024 年使用…

Xilinx浮点处理IP使用说明和测试

Xilinx浮点处理IP使用说明和测试 1 浮点数标准2 IP接口信号3 Python计算4 Vivado仿真本文主要介绍Xilinx浮点数处理IP Floating-point的使用和测试方法。 1 浮点数标准 浮点数的定义遵循IEEE-754标准,32位浮点数定义如下。 1位符号位(S):0表示正数,1表示负数8位指数位(E):…

C语言预处理详解

预处理是什么 在我们写完C语言程序的时候当我们开始运行程序时&#xff0c;程序会经过预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接这些过程之后才会生成可执行程序&#xff0c;这里我们讲的是预处理&#xff0c;预处理是编译的第一个阶段&#xff0c;在这个阶段&a…

传参的指针,你的值到底变了没?!(有关函数形参修改的另类案例)

我们都知道&#xff0c;想要在函数中修改某个变量的值&#xff0c;传变量本身是没有用的。原因在于不同的函数在不同的空间上&#xff0c;函数的生命周期随着函数的调用而结束&#xff0c;因此在函数内部进行的值操作是不会对函数外的变量产生影响的。所以在函数里面想要修改变…

网关未配置导致不同网段ping不通的小问题

问题背景&#xff1a; 搞来两台服务器&#xff0c;想用这两台装vmware来分配多个虚拟机来做开发测试 每台有两个网口&#xff0c;现在只需要一个网口就可以&#xff0c;之后想配置&#xff0c;再从vmware页面上配置&#xff0c;机房环境不是很好&#xff0c;在地下室&#xf…

C语言使用STM32开发板手搓高端家居洗衣机

目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…

C语言-写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

0xaaaaaaaa...等是什么&#xff1f;-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137179252 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define SWAP(num) (((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << …

【C++】C到C++的入门知识

目录 1、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.2.1 加命名空间名称及作用域限定符 2.2.2 使用using将命名空间中某个成员引入 2.2.3 使用using namespace 命名空间名称引入 3、C输入&输出 4、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的…

深入理解zookeeper

如果是zookeeper的初学者&#xff0c;可以看&#xff1a; zookeeper快速入门&#xff08;合集&#xff09;-CSDN博客 如果想要深入理解zookeeper&#xff0c;并在面试中取得更好的表现&#xff0c;可以看下面的文章&#xff0c;都是偏面试向的角度写的。 三分钟明白zookeeper…

名字真的会影响我们的职业吗?

名字是我们身份的一部分&#xff0c;人们往往喜欢将一个人名字同一种具体的职业联系在一起&#xff0c;而如果这个人名字看上去更适合一项工作&#xff0c;那么他&#xff08;她&#xff09;就有更多的机会得到这份工作。因此&#xff0c;我们在给福主取名改名时也会与职业特点…