E30.【C语言】练习:sizeof和strlen的习题集(B)

embedded/2024/10/22 23:24:08/

Exercise 4:sizeof 字符串

求下列代码打印结果

#define CRT_NO_WARNINGNESS 1
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "abcdef";printf("%zd\n", sizeof(arr));printf("%zd\n", sizeof(arr + 0));printf("%zd\n", sizeof(*arr));printf("%zd\n", sizeof(arr[1]));printf("%zd\n", sizeof(&arr));printf("%zd\n", sizeof(&arr + 1));printf("%zd\n", sizeof(&arr[0] + 1));return 0;
}

答案速查:

x86环境

x64环境

分析:

 ☑ printf("%zd\n", sizeof(arr));

注意结果不是6!sizeof()计算占用内存空间的大小,不关心存放的数据,因此算上\0,结果为7(一个字符占一个字节)

☑ printf("%zd\n", sizeof(arr + 0));

arr+0代表首元素的地址,因此sizeof(地址);,结果为4/8

4/8含义:4或8个字节

x86环境:4个字节

x64环境:8个字节

☑ printf("%zd\n", sizeof(*arr));

*arr是首元素,因此sizeof(元素);,又因为char类型,结果为1

☑ printf("%zd\n", sizeof(arr[1]));

arr[1]是第二个元素,因此sizeof(元素);,又因为char类型,结果为1

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

&arr是取整个数组的地址,因此sizeof(地址);,结果为4/8

☑ printf("%zd\n", sizeof(&arr + 1));

&arr是取整个数组的地址,+1跳过整个数组,但仍然是sizeof(地址);,结果为4/8

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

&arr[0]是取首元素的地址,+1第二个元素的地址,因此sizeof(地址);,结果为4/8

Exercise 5:strlen 字符串(指针版)

#include <stdio.h>
int main()
{char* p = "abcdef";printf("%zd\n", sizeof(p));printf("%zd\n", sizeof(*p));printf("%zd\n", sizeof(p[0]));printf("%zd\n", sizeof(&p + 1));printf("%zd\n", sizeof(&p[0] + 1));return 0;
}

答案速查:

x86环境

x64环境

分析:

☑ printf("%zd\n", sizeof(p));

p是一个指针变量,也就是求指针变量的存储空间,结果为4/8

☑ printf("%zd\n", sizeof(*p));

*p解引用,是首字符a,占一个字节,结果为1

☑ printf("%zd\n", sizeof(p[0]));

p[0]两种理解方式

1.把字符串当作数组,p[0]就是第一个字符a

2.p[0]等价为*(p+0),解引用是字符a

结果为1

☑ printf("%zd\n", sizeof(&p + 1));

&p+1因此sizeof(地址);,结果为4/8

细节说明

&p是取p的地址,+1则跳过p(+4个或8个字节)

x86下

输入&p

输入&p+1

恰好跳过了完整的p(d8 7b 9e 00)

因此&p+1不是单纯的地址+1!!

☑ printf("%zd\n", sizeof(&p[0] + 1));

&p[0]是字符a的地址,+1是字符b的地址,结果为4/8

Exercise 6:sizeof 二维数组

#include <stdio.h>
int main()
{int a[3][4] = { 0 };printf("%zd\n", sizeof(a));printf("%zd\n", sizeof(a[0][0]));printf("%zd\n", sizeof(a[0]));printf("%zd\n", sizeof(a[0] + 1));printf("%zd\n", sizeof(*(a[0] + 1)));printf("%zd\n", sizeof(a + 1));printf("%zd\n", sizeof(*(a + 1)));printf("%zd\n", sizeof(&a[0] + 1));printf("%zd\n", sizeof(*(&a[0] + 1)));printf("%zd\n", sizeof(*a));printf("%zd\n", sizeof(a[3]));return 0;
}

答案速查:

x86环境

x64环境

分析:

☑ printf("%zd\n", sizeof(a));

sizoef(数组名);计算整个数组的大小 3*4*4=48bytes,结果为48

☑ printf("%zd\n", sizeof(a[0][0]));

单个元素,结果为4

☑ printf("%zd\n", sizeof(a[0]));

二维数组是一维数组的数组,a[0]指第0行的数组名,结果为16(4*4=16bytes)

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

对比上一个,a[0]没有单独放入sizeof,这里的a[0]代表a[0][0]的地址,+1为a[0][1]的地址

结果为4/8

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

对a[0]+1解引用,为a[0][1],大小4bytes,结果为4

☑ printf("%zd\n", sizeof(a + 1));

a没有单独放入sizeof中,这里的a代表首元素的地址,也是第一行的地址,+1代表跳过第一行至第二行,为第二行的地址,结果为4/8

**********区分a+1和a[0]+1**********

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

由上一个可知,解引用的是第一行的元素,一共4*4=16bytes,结果为16

或这样理解:*(a+1)等同于a[1]

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

&a[0] + 1为第一行的地址(第0行+1),因此sizeof(地址);,结果为4/8

☑ printf("%zd\n", sizeof(*(&a[0] + 1)));

对第1行地址解引用,一行4元素,4*4=16bytes,结果为16

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

a没有单独放入sizeof中,这里的a代表首元素的地址,也是第一行的地址,解引用后4*4=16bytes

结果为16

☑ printf("%zd\n", sizeof(a[3]));

a[3]明显越界 sizeof没有参与运算,没有访问内存,不称为越界)尽管第3行不存在,但是其类型是确定的

总结E29和E30:

数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。

往期推荐

E29.【C语言】练习:sizeof和strlen的习题集(A)


http://www.ppmy.cn/embedded/103328.html

相关文章

Web3与人工智能的完美结合:如何重塑数字未来

随着技术的不断进步&#xff0c;Web3和人工智能&#xff08;AI&#xff09;正逐渐成为数字世界的两大支柱。这两者的结合&#xff0c;不仅为我们带来了前所未有的创新机会&#xff0c;还深刻地改变了我们对互联网和智能技术的理解。本文将探讨Web3与人工智能的结合如何重塑数字…

标准c++---2

一、名字空间 什么是名字空间 在C语言中定义的全局变量、函数、结构、联合、枚举、枚举值、宏都在全局作用域下&#xff0c;所以当项目比较庞大时&#xff0c;非常容易造成命名冲突&#xff08;以模块名作前缀、后缀&#xff09;&#xff0c;所以C中选择把全局作用域进行拆分…

四通道非洲猪瘟检测仪

四通道非洲猪瘟检测仪具有以下功能优势&#xff1a; 高效性能&#xff1a;四通道设计使得可以同时检测多个样本&#xff0c;大大提高了检测效率。这对于大规模养猪场或集中屠宰场来说尤为重要&#xff0c;可以快速筛查出可能感染非洲猪瘟的猪只。 高准确性&#xff1a;四通道检…

微软分享其首款定制人工智能芯片Maia 100的更多细节

在2023年Ignite大会期间&#xff0c;微软首次宣布其已开发出名为Maia的自主人工智能加速器芯片。今年早些时候&#xff0c;在Build开发者大会上&#xff0c;微软分享了其首个自主研发的人工智能加速器Azure Maia 100的更多细节。Maia 100 是台积电 5nm 节点上制造的最大处理器之…

(一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)

ZSWatch是一个包括硬件、软件和3D打印外壳全部开源的智能手表&#xff0c;软件功能丰富&#xff0c;并可与手机互联用来接收信息和切换歌曲&#xff0c;开源协议为GPL-3.0。 因为ZSWatch建立在Zephyr™项目RTOS之上&#xff0c;因此得名ZSWatch- Zephyr&#xff0c;目前该项目…

unity shader 鼠标传入世界坐标到shader的练习

练习贴 c#代码 using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine;public class TestInputPosShader : MonoBehaviour {public Material material;const int arrayCount 2000;Vector4[] list new Vector4[a…

P1509 找啊找啊找GF

人才出题人&#xff0c;挺会整活的。。。 一眼二维费用背包。 题目要求不单单是求最小时间&#xff0c;还要保证MM数量最多。 需要开两个数组f,dp,分别代表给定人品&#xff0c;钱能get到的最多MM数量&#xff0c;确保最多数量下的最少时间花费。 将人品&#xff0c;钱作为…

应用案例|亚克力板CNC加工自动化上下料

在现代化制造领域&#xff0c;自动化和智能化已成为提升生产效率、降低成本的关键。针对当前CNC加工过程中亚克力板上下料环节的人工操作问题&#xff0c;富唯智能提出了基于AMR&#xff08;自主移动机器人&#xff09;的复合机器人解决方案。传统的人工取料、放置以及加工完成…