C语言 sizeof 和 strlen

news2024/12/27 11:03:09

目录

一、sizeof 和 strlen 的区别 

a.sizeof

b.strlen

c.sizeof与strlen的区别

二、数组和指针笔试题解析(32位环境)

a.一维数组( int a[ ] = { 1 , 2 , 3 , 4 } )

b.字符数组

(char arr[ ] = {'a' , 'b' , 'c' , 'd' , 'e' , 'f' })

( char arr[ ] = "abcdef" )

c.二维数组( int a[3][4] = { 0 } )


一、sizeof 和 strlen 的区别 

a.sizeof

        sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。

b.strlen

        strlen 是C语言库函数,功能是求字符串长度。函数原型如下:

size_t strlen ( const char * str );

        统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会一直向后找 \0 字符,直到找到为止,所以可能存在越界查找。

        具体详见:strlen - C++ Reference (cplusplus.com)

strlen(arr1)的值是未定义的,因为数组arr1中没有 '\0' ,出现越界访问,sizeof(arr2)之所以为4,这是因为字符串的隐含条件 '\0' ,故arr2数组有元素 'a' 、'b'、 'c'、 '\n'。

c.sizeof与strlen的区别

二、数组和指针笔试题解析(32位环境)

a.一维数组( int a[ ] = { 1 , 2 , 3 , 4 } )

1、

printf("%d\n",sizeof(a));

数组名在sizeof单独出现,其代表的是整个数组,此计算的是整个数组占内存空间的大小,为 4 * 4 = 16字节。

2、

printf("%d\n", sizeof(a + 0));

数组名不单独在sizeof出现,其代表首元素地址,a + 0 为首元素地址,类型为int* ,指针变量占内存大小为4字节。

3、

printf("%d\n", sizeof(*a));

数组名不单独在sizeof出现,其代表首元素地址,对其解引用,得到数组首元素,类型为int,占内存空间大小为4字节。

4、

printf("%d\n", sizeof(a[1]));

a[1]访问第一个数组元素,其类型为int,占内存空间大小为4字节。

5、

printf("%d\n", sizeof(&a));

数组名不单独在sizeof出现,其代表首元素地址,对其取地址,那仍然还是一个地址,为二级指针,类型为int**,占内层空间大小为4字节。

6、

printf("%d\n", sizeof(*&a));

数组名不单独在sizeof出现,其代表首元素地址,对其取地址又解应用,*&a == a,所以又变成了数组名单独在sizeof出现。

b.字符数组

(char arr[ ] = {'a' , 'b' , 'c' , 'd' , 'e' , 'f' })

1、

printf("%d\n", sizeof(arr));
printf("%d\n", strlen(arr));

数组名单独在sizeof内出现代表首元素地址,计算的是整个数组的大小,为 6 * 1 = 6 字节。arr作为首元素地址,意味着strlen从第一个元素开始向后统计,但arr数组中没有 '\0' ,所以统计结果未定义。

2、

printf("%d\n", sizeof(*arr));
printf("%d\n", strlen(*arr));

arr未单独出现,为数组首元素地址,对其解引用得到首元素,strlen库函数在前文中介绍已知,其参数为字符串地址,这里传参错误。

3、

printf("%d\n", sizeof(&arr[0] + 1));
printf("%d\n", strlen(&arr[0] + 1));

arr[0] 为首元素,对其取地址再 +1 ,那么这就是第二个元素的地址喽,其类型为int*,占内存空间大小为4字节,故sizof计算为4字节,但是strlen库函数又是老问题,无论从第几个元素开始,由于没有 '\n' 结尾,结果都是未定义的。

( char arr[ ] = "abcdef" )

1、

printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr + 0));

大多数情况下,数组名都代表首元素地址,除了sizeof数组名或&数组名两个例外,那么这里arr与arr + 0 都代表数组首元素地址,这一次由于字符串末尾隐含 '\0' ,所以可以成功计数,为6。这里的6不是六个字节,而是六个字符元素。

2、

printf("%d\n", sizeof(arr));

数组名单独出现于sizeof,代表整个数组,由于字符串隐含 '\0',所以数组arr实有7个字符元素,占内存空间大小为7 * 1 = 7字节。

3、

printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr[0]));

对数组名取地址,得到的是整个数组的地址,但其值和首元素地址相同,由于没有进形指针运算,那么这里实则还是从数组首元素开始计数,为6字节;对数组首元素取地址得到数组首元素地址从数组首元素开始计数,为6字节。

c.二维数组( int a[3][4] = { 0 } )

1、

printf("%d\n", sizeof(a));

数组名单独出现于sizeof,代表整个数组,计算的是整个数组大小,占空间 3 * 4 * 4 = 48字节。

2、

printf("%d\n", sizeof(a[0]));
printf("%d\n", sizeof(a[0] + 1));

因为a为二维数组,那么a[0]就代表着第一行首元素的地址,但由于其单独出现于sizeof,计算为第一行元素总大小,为 4 * 4 = 16字节,a[0] + 1并非a[0]单独出现了,就代表第一行首元素大小,那么+1就是第一行第二个元素的地址,但由于其是一个地址,则计算结果为4字节。

3、

printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(*(a + 1)));

因为a为二维数组,故数组名代表首元素地址,二二维数组首元素地址为第一行元素数组的地址,但是当其 +1 跳过4 * 4 = 16字节后,仍然还是个地址,作为指针变量,其占内存空间大小就为4字节,对其解引用,其效果相当于第二行元素组成元素的数组名,代表整个第二行数组,计算的是第二行数组大小,其大小为4 * 4 = 16字节。

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

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

相关文章

吴恩达2022机器学习专项课程C2W3:实验Lab_01模型评估与选择

这里写目录标题 导入模块与实验环境配置回归1.构建并可视化数据集2.分割数据集3.重新绘制数据集3.特征缩放4.评估模型:计算训练集的误差5.评估模型:计算交叉验证集的误差 添加多项式1.构建多项式特征集2.缩放特征3.使用标准化的计训练集和交叉验证集&…

[next.js]移动端调试vconsole

一般最简单的调试方式当然是使用vconsole来输出想要的数据啦; next.js如果想使用的话需要在客户端环境里调用才行(服务端直接看cmd控制台就够了); 先安装vconsole npm i -D vconsolenext.js不像react cli或者vue一样有一个main.…

Python学习从0开始——Kaggle计算机视觉001

Python学习从0开始——Kaggle计算机视觉001 一、卷积分类器1.分类器2.训练分类器3.使用 二、卷积和RELU1.特征提取2.带卷积的过滤器定义3.激活:4.用ReLU检测5.使用 三、最大池化1.最大池压缩2.使用3.平移不变性 四、滑动窗口1.介绍2.步长3.边界4.使用 五、自定义Con…

[linux]如何跟踪linux 内核运行的流程呢

前面已经可以把内核编译出来,但是作为技术狗想看到内核是怎么运行的怎么办? 内核很多代码都是C语言写的,那简单,添加2行代码: include/linux/printk.h 529和530原来的: #define pr_info(fmt, ...) \ …

Vue07-MVVM模型

一、MVVM模型的定义 M:模型(model):对应data中的数据;V:视图(view):模版;VM:视图模型(ViewModel)Vue的实例对象。 Vue.js…

计算机网络 —— 运输层(UDP和TCP)

计算机网络 —— 运输层(UDP和TCP) UDPTCPUDP和TCP的异同点相同点不同点 我们今天来看运输层的两个重要的协议——UDP和TCP UDP UDP,全称为用户数据报协议(User Datagram Protocol),是互联网中一种核心的…

探地雷达正演模拟,基于时域有限差分方法,三

回顾上一章内容,主要讲了FDTD及基于C的实现方式和边界条件处理,这一章主要内容有两点:1、基于实际操作流程的GPR正演模拟(宽角法和剖面法);2、简单并行化加速GPR正演模拟(基于OpenMP&#xff09…

Mybatis Log Free

安装后重启 在 application.yml 配置 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 选择效果

搭建一个简单的深度神经网络

目录 一、引入所需要的库 二、制作数据集 三、搭建神经网络 四、训练网络 五、测试网络 本博客实验环境为jupyter 一、引入所需要的库 torch库是核心,其中torch.nn 提供了搭建网络所需的所有组件,nn即神经网络。matplotlib类似与matlab&#xff0…

Apple Intelligence全面来袭,熟悉但又不同的味道

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技(Mamba,xLSTM,KAN)则提…

618购物节入手哪些数码好物好?年度必备好物清单大盘点

随着一年一度的618购物节的到来,数码市场再次掀起了热潮,在这个属于消费者的狂欢节里,各大品牌和商家纷纷推出优惠活动和新品,为数码爱好者们带来了无数的购物选择,那么在这个购物盛宴中,我们应该如何挑选那…

如何进行论文查重,选择合适的查重系统?

原创性是学术写作海洋中的航行灯塔,而论文查重(www.check110.com)则是保障这束光芒不被云雾遮蔽的工具。而查重系统如何对论文进行查重,又该如何选择论文查重系统呢? 一、论文查重 论文查重,就是检测学术…

Python基础教程(十三):file文件及相关的函数

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

idea中使用逆向工程生成数据库表的实体类

1、在idea中打开数据库视图; 2、点击database中的号创建数据源连接(以MySQL为例); 填入账户密码以及数据库名; 点击测试连接,若出现爆红Server returns invalid timezone. Go to Advanced tab and set serv…

RawChat:优化AI对话体验,全面兼容GPT功能平台

文章目录 一、Rawchat简介1.1 RawChat的主要特性1.2 RawChat的技术原理简述 二、使用教程三、案例应用3.1 图片内容分析3.2 生图演示3.3 文档解析3.4 探索更多 四、小结 一、Rawchat简介 RawChat平台的诞生,其核心理念是降低用户访问类似ChatGPT这类先进AI服务的门…

MySQL复习题(期末考试)

MySQL复习题(期末考试) 1.MySQL支持的日期类型? DATE,DATETIME,TIMESTAMP,TIME,TEAR 2.为表添加列的语法? alter table 表名 add column 列名 数据类型; 3.修改表数据类型的语法是? alter table 表名 modify 列名 新…

文心智能体体验,打造你自己的GPTs应用

利用百度智能体搭建的《RPG冒险游戏大作战》已经发布啦! RPG冒险游戏大作战 玩家扮演一位小小勇士女孩,从被巨龙毁灭的冒险小镇出发,一路披荆斩棘,集齐四件神器后,打败巨龙,夺回小镇的安宁! 整…

python3的基本语法说明一

一. 简介 本文开始学习 python3 的基本语法。 二. python3的基本语法 1. 编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*- 上述…

Unity图集

概述 相信在同学们学习过程中,在UI的的使用时候一定经常听说过图集的概念。 Unity有UI的组件,有同学们好奇,那为什么还要使用图集呢? 这就需要提到一个性能优化的问题了,因为过多的UI图片,会大幅增加Dra…

隔离式 AC-DC 反激电源设计原理分析

LinkSwitch-LP 系列旨在取代手机/无绳电话、PDA、数码相机和便携式音频播放器等应用中输出功率 < 2.5 W 的低效线频线性变压器电源。LinkSwitch-LP 还可用作白色家电等应用中的辅助电源。 LinkSwitch-LP 将高压功率 MOSFET 开关与 ON/OFF 控制器集成在一个设备中。它完全由…