当前位置: 首页 > news >正文

C语言 | sizeof与strlen的区别(附笔试题)

目录:

1. sizeof和strlen的对比

2. 数组和指针 笔试题解析

3. 指针运算 笔试题解析 

内容多多,需耐心看完,加油!!!


 一.sizeof和strlen的对比

1.1 sizeof

在学习操作符的时候,我们学习了 sizeof , sizeof为单目操作符。

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

例如: 

d9c8f12e05fd4731a06c95e3343ae736.png

1.2 strlen 

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

size_t strlen ( const char * str );

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

2bc731fbf4594163be9de41e03098ea0.png

1.3 sizeof 和 strlen的对比

4fff3f15a78941de8635e47f86cb6250.png


 二. 数组和指针笔试题解析

2.1 ⼀维数组

自己可以先计算下面10个问题的答案,之后会给出解析。

int a[] = {1,2,3,4}; //4个元素printf("%zd\n",sizeof(a)); //1
printf("%zd\n",sizeof(a+0)); //2
printf("%zd\n",sizeof(*a)); //3
printf("%zd\n",sizeof(a+1)); //4
printf("%zd\n",sizeof(a[1])); //5
printf("%zd\n",sizeof(&a)); //6
printf("%zd\n",sizeof(*&a)); //7
printf("%zd\n",sizeof(&a+1)); //8
printf("%zd\n",sizeof(&a[0])); //9
printf("%zd\n",sizeof(&a[0]+1)); //10

 【之前的文章也讲到,关于对数组名的理解:

数组名是数组首元素(第一个元素)的地址

but有两个例外:

1. sizeof(数组名)--数组名表示整个数组,计算的是整个数组的大小,单位为字节

2. &数组名--数组名表示整个数组,取出的是整个数组的地址】

第1--5题:(x64环境下)

015c6881a88546a0a92d2f656624f147.png

第6--10题:

a3fca4bbe78d49d383d101b898b58485.png

 2.2 字符数组

代码1:主要考查sizeof

char arr[] = {'a','b','c','d','e','f'};//存放6个字符
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

解析为:

e6e8256249634e9abf6f6f97c2f95743.png

 代码2:主要考查strlen

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

解析为:

725aa55de2ee40be886de251dcc84b98.png

代码3:主要考查sizeof

char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

解析为: 

517ae3b4951d4f96b788ed9102bbdcd3.png

代码4:主要考查strlen

char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

解析为: 

52f62c07e7fa4b8f9edd38147bb009d7.png

代码5:

char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));

 解析为:

21372c9c91714b06a19d482a79e772d3.png

代码6:

char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

解析为:

7b4479a3c25d4e2c9b2290469712547a.png

2.3 ⼆维数组

int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));

 解析为:

ba5ebbe819164bf6bd76720f398e0988.png

3. 指针运算笔试题解析

 题目1: 

#include <stdio.h>
int main()
{int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);printf( "%d,%d", *(a + 1), *(ptr - 1));return 0;
}

程序的结果是什么?

f80b2fb64be945ccb3c1692e9c368fe0.png

5f72eacbb08342ef8bb695395116752a.png

题目2 :

在X86(32位)环境下  假设结构体的大小是20个字节  程序输出的结果是啥?

struct Test
{int Num;char *pcName;short sDate;char cha[2];short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

解析为:

5522b32581244157b7d653fc1f825f32.png

题目3:

#include <stdio.h>
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };int *p;p = a[0];printf( "%d", p[0]);return 0;
}

 解析为:

dd9c94fb419549209a75b3fc922f8528.png

fbee3dcadaca4964850dbf27ace29d24.png

题目4:

假设环境是x86环境,程序输出的结果是啥?

#include <stdio.h>
int main()
{int a[5][5];int(*p)[4];p = a;printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0;
}

解析为:

857516129a3243daa2be77ab9eba6e11.png

 

 

相关文章:

C语言 | sizeof与strlen的区别(附笔试题)

目录&#xff1a; 1. sizeof和strlen的对比 2. 数组和指针 笔试题解析 3. 指针运算 笔试题解析 内容多多&#xff0c;需耐心看完&#xff0c;加油&#xff01;&#xff01;&#xff01; 一.sizeof和strlen的对比 1.1 sizeof 在学习操作符的时候&#xff0c;我们学习了 s…...

AI自动绘画器介绍和应用场景

AI自动绘画器是一种利用人工智能技术来生成绘画作品的工具。以下是一些常见的AI自动绘画器&#xff1a; DeepDream&#xff1a; 风格&#xff1a;可以生成三种风格的图片&#xff0c;包括深度梦幻风格、深度风格和浅层风格。应用场景&#xff1a;起初设计用于帮助研究人员理解…...

java二叉树前中后序遍历

代码随想录解题思路&#x1f192;力扣前序题目&#x1f192;力扣中序题目&#x1f192;力扣后序题目 递归遍历 // 前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();preorder(root…...

【LeetCode刷题笔记】LeetCode 1365.有多少小于当前数字的数字

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…...

室内定位中文综述阅读

1 室内高精度定位技术总结与展望 [4]柳景斌,赵智博,胡宁松等.室内高精度定位技术总结与展望[J].武汉大学学报(信息科学 版),2022,47(07):997-1008.DOI:10.13203/j.whugis20220029. 1.1.1 WiFi‐RTT定位 2016 年 12 月&#xff0c;随着新版 IEEE802.11 标准的公布&#xff0c…...

微信小程序uniapp+vue电力巡线任务故障报修管理系统2q91t

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端开发:vue 语言&#xff1a;javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/t…...

springboot国际化多语言

1,新建国际化多语言文件 在resources目录下新建 messages.properties 其他语言的文件 编辑messages.properties文件,下方从text切换到Resource Bundle ,即可对照着编辑多语言文件 (如果没有找到Resource Bundle,先在settings->plugins中安装Resource Bundle Editor) 2,配…...

set和map

这里是目录标题 setinsertfinderasecountlower_boundupper_boundmultisetset的应用 mappairinsertinsert的pair map的遍历map对[ ]的重载(重点)multimap set set的普通迭代器和const迭代器都不支持修改。(这点可以根据源代码看出来&#xff0c;都是对const iterator进行了type…...

Open CASCADE学习|求曲面的参数空间

在三维空间中&#xff0c;任意的曲面都可以通过特定的方法映射到一个二维参数平面上&#xff0c;从而对其进行详细的几何分析和处理。首先&#xff0c;我们需要从三维模型中提取出特定的曲面&#xff0c;这通常被称为“Face”。一个face可以被视为三维空间中的一个封闭区域&…...

代码随想录阅读笔记-二叉树【总结】

二叉树的理论基础 代码随想录 (programmercarl.com)&#xff1a;二叉树的种类、存储方式、遍历方式、定义方式 二叉树的遍历方式 深度优先遍历 代码随想录阅读笔记-二叉树【递归遍历】-CSDN博客&#xff1a;递归三部曲初次亮相代码随想录阅读笔记-二叉树【迭代遍历】-CSDN博…...

【SpringBoot整合系列】SpringBoot整合FastDFS(二)

目录 SpringBoot整合FastDFSJava客户端/依赖常用api接口解释1.uploadFile参数返回值 2.uploadSlaveFile参数返回值 3.getMetadata参数返回值 4.overwriteMetadata参数&#xff1a;返回值&#xff1a;无 5.mergeMetadata参数&#xff1a;返回值&#xff1a;无 6.queryFileInfo参…...

L2-2 巴音布鲁克永远的土(二分+并查集)

思路&#xff1a;我们可以二分答案&#xff0c;然后判断当前答案合不合理。 对于判断答案合理&#xff0c;可以用并查集&#xff0c;看mid能否把所有检查点连进一个集合中&#xff0c;枚举每个结点&#xff0c;如何当前结点周围的四个方向可以连的话&#xff0c;就加进同一个集…...

Spring Cloud学习笔记:Eureka简介,Eureka简单样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 [TOC](目录)1、Eureka 1.1、架构 Eureka是SpringCloud Nexflix的核心子模块&#xff0c;其中包含Server和Client。 Server提供服务注册&#xff0c;存储所有可用服务节点。 Client用于简化和Server的通讯复杂…...

【漏洞复现】WordPress Welcart 任意文件读取漏洞(CVE-2022-4140)

0x01 产品简介 Welcart 是一款免费的 WordPress 电子商务插件。Welcart 具有许多用于制作在线商店的功能和自定义设置。您可以轻松创建自己的原始在线商店。 0x02 漏洞概述 Welcart存在任意文件读取漏洞&#xff0c;未授权的攻击者可以通过该漏洞读取任意文件&#xff0c;获…...

快速排序:深入解析其原理、实现与性能特性

快速排序&#xff0c;以其名字所示&#xff0c;是一种追求速度的高效排序算法。作为分治法在排序问题上的典型应用&#xff0c;快速排序凭借其平均情况下近乎理想的O(n log n)时间复杂度和简洁的实现逻辑&#xff0c;在实际编程与数据处理中占据着重要地位。本篇博客将详细解析…...

一文看懂Mac地址

一、Mac地址是什么&#xff1f; 虽然IP地址已经成为一个家喻户晓的术语&#xff0c;但还有一个同样重要的数字标识符值得我们关注——MAC地址。在本文中&#xff0c;我们旨在阐明网络中这个经常被忽视的方面。加入我们&#xff0c;深入研究 MAC 地址的世界&#xff0c;了解它们…...

2024.4.10作业

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); } Widget::~Widget() { delete ui; } //显示时间 void Widget::timerEvent(QTimerEvent *e) { QT…...

python - Django创建项目

项目运行命令 根目录下运行命令:   python manage.py runserver win环境创建项目 直接使用 Pycharm 创建项目 在 cmd 或 Linux 命令行环境下创建 Django 项目 django-admin startproject mysite 这样就会在当前目录下创建一个叫做 mysite 的Django项目。   可以看到Djang…...

WPF —— 动画缩放变换

ScaleTransform:在二维x-y坐标系统内缩放对象; 在故事板中依赖的属性为RenderTransform.ScaleX或RenderTransform.ScaleY,这要根据你要沿哪个轴进行缩放,X代表x轴,Y代表y轴; key属性当我们使用静态资源访问时候--> <!--TargetType"{x:Type Button} 直接应用…...

SQL注入---盲注

文章目录 目录 一.盲注概述 布尔盲注&#xff1a; 时间盲注&#xff1a; 一.盲注概述 注是一种SQL注入攻击的形式&#xff0c;在这种攻击中&#xff0c;攻击者向目标应用程序发送恶意注入代码&#xff0c;然后通过观察应用程序的响应来推断出数据库中的信息。与常规的SQL注入…...

用Qwen3-VL-30B做智能助手:上传文档图片,自动提取关键信息

用Qwen3-VL-30B做智能助手&#xff1a;上传文档图片&#xff0c;自动提取关键信息 1. 为什么需要智能文档处理助手 每天我们都会遇到大量需要处理的文档和图片&#xff1a;合同、发票、报告、表格、名片...手动输入这些信息不仅耗时耗力&#xff0c;还容易出错。传统OCR技术虽…...

低功耗设计避坑指南:从UPF报错案例学习isolation rules的正确姿势

低功耗设计避坑指南&#xff1a;从UPF报错案例学习isolation rules的正确姿势 在芯片设计领域&#xff0c;低功耗已成为衡量产品竞争力的核心指标之一。随着工艺节点不断演进&#xff0c;静态功耗占比显著提升&#xff0c;使得电源门控&#xff08;Power Gating&#xff09;技术…...

Qwen3-Reranker-0.6B效果展示:长文档片段(32K)语义匹配能力实测

Qwen3-Reranker-0.6B效果展示&#xff1a;长文档片段&#xff08;32K&#xff09;语义匹配能力实测 1. 引言&#xff1a;当搜索遇到“大海捞针” 你有没有过这样的经历&#xff1f;面对一份几十页的PDF报告&#xff0c;或者一个包含数千条记录的数据库&#xff0c;想快速找到…...

CVPR 2026 手物交互数据生成新SOTA

Project Page: https://gasaiyu.github.io/PAM.github.io/01▪ 在只给定初始姿态、目标姿态和不含外观的物体几何信息的输入下&#xff0c;如何直接生成逼真的手物交互&#xff08;HOI&#xff09;视频&#xff1f;▪ 现有方法存在一系列问题&#xff1a;姿态合成方法只能预测 …...

FPGA设计中的组合逻辑环:为什么你的Verilog代码会引发警告?

FPGA设计中的组合逻辑环&#xff1a;为什么你的Verilog代码会引发警告&#xff1f; 在数字电路设计的浩瀚海洋中&#xff0c;组合逻辑环&#xff08;Combinational Loop&#xff09;就像是一个潜伏的暗礁&#xff0c;看似无害却可能让你的整个设计"触礁沉没"。作为一…...

南北阁Nanbeige 4.1-3B Git版本控制实战:从入门到团队协作

南北阁Nanbeige 4.1-3B Git版本控制实战&#xff1a;从入门到团队协作 本文面向刚接触版本控制的开发者&#xff0c;手把手教你用南北阁Nanbeige 4.1-3B掌握Git核心技能&#xff0c;从基础命令到团队协作全流程。 1. 为什么你需要Git版本控制&#xff1f; 刚开始写代码时&…...

暗黑破坏神2存档编辑器的创意实验:开启你的游戏世界无限可能

暗黑破坏神2存档编辑器的创意实验&#xff1a;开启你的游戏世界无限可能 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾想过在暗黑破坏神2的世界里创造属于自己的传奇&#xff1f;当传统的游戏进程无法满足你的创意需求…...

MinerU 2.5-1.2B新手教程:无需深度学习基础,快速上手PDF提取

MinerU 2.5-1.2B新手教程&#xff1a;无需深度学习基础&#xff0c;快速上手PDF提取 1. 引言&#xff1a;为什么选择MinerU&#xff1f; PDF文档是我们日常工作和学习中常见的文件格式&#xff0c;但要从PDF中提取内容却常常让人头疼。特别是遇到学术论文、技术报告这类包含复…...

ADC0808搭配51单片机测电压:从芯片手册解读到量程切换逻辑的代码实现

ADC0808与51单片机电压测量系统&#xff1a;从芯片手册到智能量程切换的工程实践 在嵌入式系统开发中&#xff0c;精确的电压测量是许多应用的基础功能。ADC0808作为经典的8位模数转换器&#xff0c;与51单片机的组合曾是工业控制和仪器仪表领域的黄金搭档。本文将带您深入探索…...

QtPlaskin实战指南:从HDF5数据解析到等离子体动力学可视化

1. QtPlaskin与等离子体动力学分析入门 第一次接触QtPlaskin时&#xff0c;我被它处理复杂等离子体数据的能力惊艳到了。这个基于Python和Qt开发的图形工具&#xff0c;专门用于解析ZDPlasKin等等离子体动力学程序生成的HDF5格式数据。想象一下&#xff0c;你刚完成了一个长达…...