【C语言】_sizeof与strlen的相关示例

ops/2025/1/13 10:12:08/

目录

1. 与一维数组相关

2. 与字符数组相关

2.1 逐字符初始化的字符数组与sizeof

2.2 逐字符初始化的字符数组与strlen

2.3 字符串初始化的字符数组与sizeof

2.4 字符串初始化的字符数组与strlen

3. 与常量字符串相关

3.1 常量字符串与sizeof

3.2 常量字符串与strlen

4. 与二维数组相关


关于sizeof与strlen,相关文章如下:

【C语言】_sizeof与strlen-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_63299495/article/details/145082378关于数组与指针,相关文章如下:

【C语言】_指针与数组-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_63299495/article/details/144947245由于指针相关计算易错易混淆,本文整理指针与数组的相关计算用例。

1. 与一维数组相关

int main() {int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));// sizeof(数组名):表示整个数组大小=4*4=16;printf("%d\n", sizeof(a + 0));// 数组名a=数组首元素地址(int*类型),a+0仍为首元素地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(*a));// 数组名a=数组首元素地址(int*类型),*a为首元素(int类型),sizeof(int型变量)=4;printf("%d\n", sizeof(a + 1));// 数组名a=数组首元素地址(int*类型),a+1表示跳过1个int型数据后的地址,即第二个元素的地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(a[1]));// a[1]即第二个元素,sizeof(int型变量)=4;printf("%d\n", sizeof(&a));// &a=整个数组地址(int*类型),sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(*&a));// &a=整个数组地址,*&a表示数组所有元素,sizeof(4个int型数据)=4*4=16;// *与&抵消,sizeof(*&a)=sizeof(a),表示整个数组的大小=4*4=16;printf("%d\n", sizeof(&a + 1));// &a=整个数组地址,&a+1表示跳过整个数组后的地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(&a[0]));// &a[0]=数组首元素的地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(&a[0] + 1));// &a[0]=数组首元素的地址(int*型),&a[0]+1表示跳过1个int型数据后的地址,sizeof(地址)=4或8(与平台有关);return 0;
}

运行结果如下:

x86(32位平台): 

x64(64位平台):

2. 与字符数组相关

2.1 逐字符初始化的字符数组与sizeof

int main() {char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr));// sizeof(数组名)表示整个数组的大小=6*1=6;printf("%d\n", sizeof(arr + 0));// 数组名arr表示数组首元素地址(char*类型),sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(*arr));// 数组名arr表示数组首元素地址,*arr表示数组首元素(char类型),sizeof(char型变量)=1;printf("%d\n", sizeof(arr[1]));// arr[1]表示数组下标为1的元素(char型),sizeof(char型变量)=1;printf("%d\n", sizeof(&arr));// &数组名表示整个数组的地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(&arr + 1));// &数组名表示整个数组的地址,&arr+1表示跳过整个数组后的地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(&arr[0] + 1));// &arr[0]表示数组首元素的地址,&arr[0]+1表示跳过一个数组元素后的地址,sizeof(地址)=4或8(与平台有关);return 0;
}

运行结果如下: 

x86(32位平台):

x64(64位平台):

2.2 逐字符初始化的字符数组与strlen

#include<string.h>int main() {char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", strlen(arr));// arr表示首元素地址,字符数组中不含\0,\0位置未知,长度为 > 6的随机值printf("%d\n", strlen(arr + 0));// arr表示首元素地址,arr+0仍为首元素地址,字符数组中不含\0,\0位置未知,长度为 > 6的随机值// printf("%s\n", strlen(*arr));// arr表示数组首元素地址,*arr表示数组首元素字符a(ASCII码值为97),streln要求参数为起始检索地址,97地址为野指针,程序报错// printf("%d\n", strlen(arr[1]));// arr[1]表示数组下标为1的元素字符b(ASCII码值为98),streln要求参数为起始检索地址,98地址为野指针,程序报错printf("%d\n", strlen(&arr));// &arr表示整个数组的地址,在数值上等于数组首元素的地址,字符数组中不含\0,\0位置未知,长度为 > 6的随机值printf("%d\n", strlen(&arr + 1));// &arr表示整个数组的地址,&arr+1表示跳过整个数组(6字节)后的地址,相较于起始地址,该结果为起始地址对应产生随机值减小6后的随机值printf("%d\n", strlen(&arr[0] + 1));// &arr[0]表示数组首元素的地址,&arr[0]+1表示跳过1个元素(1字节)后的地址,相较于起始地址,该结果为起始地址对应产生随机值减小1后的随机值return 0;
}

运行结果如下:

2.3 字符串初始化的字符数组与sizeof

int main() {char arr[] = "abcdef";// a b c d e f \0printf("%d\n", sizeof(arr));// sizeof(数组名)表示整个数组的大小=7;printf("%d\n", sizeof(arr + 0));// arr=&arr[0],arr+0=arr=&arr[0],sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(*arr));// arr=&arr[0],*arr=arr[0]='a'(char型),sizeof(char型变量)=1;printf("%d\n", sizeof(arr[1]));// arr[1]='b'(char型),sizeof(char型变量)=1;printf("%d\n", sizeof(&arr));// &arr表示整个数组的地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(&arr + 1));// &arr表示整个数组的地址,&arr+1表示跳过整个数组(7B)后的地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(&arr[0] + 1));// &arr[0]表示数组首元素的地址,&arr[0]+1表示跳过1个元素(1B)后的地址,sizeof(地址)=4或8(与平台有关);return 0;
}

运行结果如下:

x86(32位平台):

x64(64位平台):

2.4 字符串初始化的字符数组与strlen

#include<string.h>
#include<stdio.h>
int main() {char arr[] = "abcdef";// a b c d e f \0 共7个元素printf("%d\n", strlen(arr));// arr=&arr[0]=&('a'),'a'->\0: 6Bprintf("%d\n", strlen(arr + 0));// arr=arr+0=&arr[0]=&('a'),'a'->\0: 6B// printf("%d\n", strlen(*arr));// arr=&arr[0],*arr=arr[0]='a'=97,strlen将97解析为地址,判定为野指针,程序报错// printf("%d\n", strlen(arr[1]));// arr[1]='b'=98, strlen将98解析为地址,判定为野指针,程序报错;printf("%d\n", strlen(&arr));// &arr数值上=&arr[0]=&('a'),'a'->\0: 6Bprintf("%d\n", strlen(&arr + 1));// &arr+1表示跳过整个数组(7B)后的地址,\0位置未知,为随机值printf("%d\n", strlen(&arr[0] + 1));// &arr[0]+1表示跳过首元素(1B)后的地址=&arr[1]=&('b'),'b'->\0: 5Breturn 0;
}

运行结果如下:

3. 与常量字符串相关

3.1 常量字符串与sizeof

#include<stdio.h>
int main() {char* p = "abcdef";// 隐含一个\0: a b c d e f \0printf("%d\n", sizeof(p));// p=&('a')(char*类型),sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(p + 1));// p+1表示跳过一个元素(1B)后的地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(*p));// p=&('a'),*p='a'(char类型),sizeof(char型变量)=1;printf("%d\n", sizeof(p[0]));// p[0]='a'(char类型),sizeof(char型变量)=1;printf("%d\n", sizeof(&p));//  p=&('a')(char*类型),&p为二级指针(char**类型),sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(&p + 1));// &p为二级指针(char**类型),&p+1表示跳过一个char*类型的元素(4或8B)后的地址,sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(&p[0] + 1));// p[0]='a'(char类型),&p[0]=&('a'),&p[0]+1表示跳过1个元素(1B)后的地址,sizeof(地址)=4或8(与平台有关);return 0;
}

运行结果如下:

x86(32位平台):

x64(64位平台):

3.2 常量字符串与strlen

#include<string.h>
#include<stdio.h>
int main() {char* p = "abcdef";// 隐含一个\0: a b c d e f \0printf("%d\n", strlen(p));// p=&('a'),'a'->\0: 6printf("%d\n", strlen(p + 1));// p=&('a'),p+1=&('b'),'b'->\0: 5// printf("%d\n", strlen(*p));// p=&('a'),*p='a'=97,strlen将97解析为地址,判定为野指针,程序报错// printf("%d\n", strlen(p[0]));// p[0]='a'=97,strlen将97解析为地址,判定为野指针,程序报错printf("%d\n", strlen(&p));// p=&('a'),&p为二级指针(char**类型),&p未知,自&p起\0位置未知,输出随机值printf("%d\n", strlen(&p + 1));// p=&('a')(char*类型),&p为二级指针(char**类型),&p未知,&p+1表示跳过一个char*(4B)后的地址,输出随机值printf("%d\n", strlen(&p[0] + 1));// &p[0]=&('a'),&p[0]+1表示跳过1个char(1B)后的地址=&p[1]=&('b'),'b'->\0: 5return 0;
}

运行结果如下:(以x86为例,地址4B)

4. 与二维数组相关

关于二维数组,相关文章如下:

【C语言】_指针数组和数组指针-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_63299495/article/details/145033052关于二维数组arr[ m ] [ n ]的理解:

(1)数组名arr:表示二维数组第一行的一维数组的地址

(2)arr[ i ] (0 ≤ i ≤ m):即二维数组第 i 行的一维数组的数组名

关于特殊情况的判定:

(1)当数组名单独放至sizeof内部时,即sizeof (数组名)时,数组名不可解析为数组首元素地址,此时sizeof计算的是整个数组的大小;

对于二维数组,需注意arr [ i ] 的含义,sizeof(arr[i])表示数组第i行一维数组的n个元素的大小;

(2)当&数组名时,数组名不可解析为数组首元素地址,此时&数组名取到的是整个数组的地址。

在数值上确实等于数组首元素的地址,但当其进行+-整数的运算时,则会出现不同;

对于二维数组,需注意arr [ i ] 的含义,&arr[ i ]+1表示跳过一行一维数组后的第二行一维数组的数组地址;

#include<string.h>
#include<stdio.h>
int main() {int a[3][4] = { 0 };printf("%d\n", sizeof(a));// sizeof(数组名)表示整个数组的大小=3*4*4=48;printf("%d\n", sizeof(a[0][0]));// sizeof(int型数据)=4;printf("%d\n", sizeof(a[0]));// a[0]表示二维数组第1行一维数组的数组名,sizeof(数组名)=整个一维数组的大小=4*4=16;printf("%d\n", sizeof(a[0] + 1));// a[0]表示二维数组第1行一维数组的数组名,由于a[0]并未单独放至sizeof内部,故a[0]=&a[0][0],// a[0]+1=&a[0][0]+1=&a[0][1], sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(*(a[0] + 1)));// a[0]+1=&a[0][0]+1=&a[0][1], *(a[0] + 1)=*(&a[0][1])=a[0][1],sizeof(int型数据)=4;printf("%d\n", sizeof(a + 1));// a=&a[0],a+1=&a[0]+1=&a[1],即二维数组第2行的一维数组的数组名,// 由于a作为数组名并未单独放至sizeof内部,故a+1=&a[0]+1=&a[1](数组指针类型),sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(*(a + 1)));// a+1=&a[1]+1=&a[1],*(a+1)=*(&a[1])=&a[1],表示数组第2行的一维数组的大小=4*4=16;printf("%d\n", sizeof(&a[0] + 1));// a[0]表示数组第1行一维数组的数组名,&数组名表示整个数组的地址,&a[0]表示第1行一维数组的数组地址,// &a[0]+1表示跳过一行数组后的数组地址,即第2行一维数组的数组地址,&a[0]+1=&a[1],sizeof(地址)=4或8(与平台有关);printf("%d\n", sizeof(*(&a[0] + 1)));// &a[0]+1=&a[1],*(&a[0] + 1))=*(&a[1])=a[1],即表示数组第2行一维数组的4个元素,sizeof(a[1])=4*4=16printf("%d\n", sizeof(*a));// a=&a[0],*a=*(&a[0])=a[0],sizeof(a[0])=4*4=16;printf("%d\n", sizeof(a[3]));// a[3]表示数组第3行一维数组的数组名,数组名单独放至sizeof内部,表示整个一维数组的大小=4*4=16;return 0;
}

运行结果如下:

x86(32位平台):

x64(64位平台):


http://www.ppmy.cn/ops/149694.html

相关文章

项目实战--网页五子棋(用户模块1)

接下来我将使用Java语言&#xff0c;和Spring框架&#xff0c;实现一个简单的网页五子棋。 主要功能包括用户登录注册&#xff0c;人机对战&#xff0c;在线匹配对局&#xff0c;房间邀请对局&#xff0c;积分排行版等。 这篇文件讲解用户模块的后端代码 1. 用户表与实体类 …

【JavaEE进阶】获取Cookie/Session

&#x1f340;Cookie简介 HTTP协议自身是属于 "⽆状态"协议. "⽆状态"的含义指的是: 默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系.但是实际开发中,我们很多时候是需要知道请求之间的关联关系的. 例如登陆⽹站成…

android分区和root

线刷包内容&#xff1a; 线刷包是一个完整的android镜像&#xff0c;不但包括android、linux和用户数据&#xff0c;还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区&#xff0c;包括linux下主要的二进制程序。 boot.img…

【excel】VBA股票数据获取(搜狐股票)

文章目录 一、序二、excel 自动刷新股票数据三、付费获取 一、序 我其实不会 excel 的函数和 visual basic。因为都可以用matlab和python完成。 今天用了下VBA&#xff0c;还挺不错的。分享下。 上传写了个matlab获取股票数据的&#xff0c;是雅虎财经的。这次是搜狐股票的数…

Web前端界面开发

前沿&#xff1a;介绍自适应和响应式布局 自适应布局&#xff1a;-----针对页面1个像素的变换而变化 就是我们上一个练习的效果 我们的页面效果&#xff0c;随着我们的屏幕大小而发生适配的效果&#xff08;类似等比例&#xff09; 如&#xff1a;rem适配 和 vw/vh适配 …

负载均衡概述

nginx是典型的负载均衡组件&#xff0c;还有haproxy&#xff0c;这些是软件负载均衡。另一种是硬件负载均衡&#xff0c;像F5等。在微服务开发过程中&#xff0c;还会有像ribbo,loadbalance等等。 从大的方面&#xff0c;可以把负载均衡分两类&#xff1a; 1. 服务端负载均衡 …

ChatGPT 主流模型GPT-4/GPT-4o mini的参数规模是多大?

微软论文又把 OpenAI 的机密泄露了&#xff1f;&#xff1f;在论文中明晃晃写着&#xff1a; o1-preview 约 300B&#xff1b;o1-mini 约 100BGPT-4o 约 200B&#xff1b;GPT-4o-mini 约 8BClaude 3.5 Sonnet 2024-10-22 版本约 175B微软自己的 Phi-3-7B&#xff0c;这个不用约…

在Node.js中借助腾讯云SDK调用混元大模型

前言 随着人工智能技术的不断发展&#xff0c;强大的大模型如腾讯的混元大模型&#xff08;HunYuan&#xff09;为开发者提供了丰富的智能服务能力。本文将详细介绍如何在 Node.js 环境中使用腾讯云提供的 SDK 调用混元大模型&#xff0c;构建一个简单的 API 接口来实现与模型…