C语言 sizeof, size_t, strlen

news/2024/5/19 15:28:42/文章来源:https://blog.csdn.net/zhangHP_123/article/details/130393519

C语言 sizeof, size_t, strlen

文章目录

  • C语言 sizeof, size_t, strlen
    • 一. sizeof
      • 1.1 返回结构体长度
    • 二. size_t
    • 三. sizeof 和 strlen

一. sizeof

返回一个结构体或者类型所占的内存字节数

1.1 返回结构体长度

这里我编写了2个结构体,区别在于数组问题

#include <stdio.h>struct test{int length;int space;char arr[];
};
struct _test{int length;int space;char *arr;
};
int main(){printf("%d\n",sizeof(struct test));printf("%d\n",sizeof(struct _test));return 0;
}

编译c文件,查看结果

[root@localhost second-six]# gcc demo_sizeof.c
[root@localhost second-six]# ./a.out 
8
16

从这里我们可以看出定义char arr[]和char *p,输出的结果不同

  1. char arr[],初始化为0字节,需要到时在堆内存赋值长度,拿一个redis2.8.14源码示例,sds.c文件

    可变数组,在编译期生成,没有编译期不生成,必须动态分配

sds sdsnewlen(const void *init, size_t initlen) {struct sdshdr *sh;if (init) {// 初始化内存sh = zmalloc(sizeof(struct sdshdr)+initlen+1); } else {// 初始化内存sh = zcalloc(sizeof(struct sdshdr)+initlen+1);}if (sh == NULL) return NULL;sh->len = initlen;sh->free = 0;if (initlen && init)memcpy(sh->buf, init, initlen);sh->buf[initlen] = '\0';return (char*)sh->buf;
}// 结构体
struct sdshdr {unsigned int len;unsigned int free;char buf[];
};
  1. char *arr,可通过汇编看出

    默认赋值16,而char *arr相当于初始化机器的位数,如机器是64bit,则初始化8byte

[root@localhost second-six]# gcc -S -fno-asynchronous-unwind-tables demo_sizeof.c
[root@localhost second-six]# cat demo_sizeof.s.file	"demo_sizeof.c".text.section	.rodata
.LC0:.string	"%d\n".text.globl	main.type	main, @function
main:pushq	%rbpmovq	%rsp, %rbpmovl	$8, %esimovl	$.LC0, %edimovl	$0, %eaxcall	printfmovl	$16, %esi    //默认赋值16movl	$.LC0, %edimovl	$0, %eaxcall	printfmovl	$0, %eaxpopq	%rbpret.size	main, .-main.ident	"GCC: (GNU) 9.3.1 20200408 (Red Hat 9.3.1-2)".section	.note.GNU-stack,"",@progbits

二. size_t

由于存放当前地址值不知当前机器平台的位数,并保证代码具有可移植性,定义一个关键字size_t在使用当前平台位数来初始化.

通过size_t获取int内存存储大小

#include <stdio.h>int main(){int a = 1;size_t b =(size_t)&a;size_t c =(size_t)((&a)+1);printf("%d\n", c - b);return 1;
}

输出结果

[root@localhost second-six]# gcc demo_size_t.c
[root@localhost second-six]# ./a.out 
4

三. sizeof 和 strlen

sizeof() 算的是总空间大小,运算符

strlen() 算的是加到\0之前的大小,函数

[root@localhost second-six]# cat demo_sizeof3.c
#include <stdio.h>
#include <string.h>int main(){printf("%d\n", sizeof("hello"));printf("%d\n", strlen("hello"));printf("%d\n", sizeof("hel\0lo"));printf("%d\n", strlen("hel\0lo"));
}

输出结果

[root@localhost second-six]# gcc demo_sizeof3.c
[root@localhost second-six]# ./a.out 
6
5
7
3

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

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

相关文章

基于本地知识构建简易的chatPDF

Langchain chatglm-6b 文章目录 Langchain chatglm-6b前言一、实验记录1.1 环境配置1.2 代码理解1.3 补充内容 二、总结 前言 介绍&#xff1a;一种利用 ChatGLM-6B langchain 实现的基于本地知识的 ChatGLM 应用 Github: https://github.com/imClumsyPanda/langchain-Chat…

《个人博客部署上线教程一》Halo搭建个人博客网站

Halo搭建个人博客网站 一、docker部署Halo 目前测试了两种方法安装Halo&#xff0c;第一种是使用Jar包安装:提供JAR包资源&#xff0c;不过因为使用jar包部署需要Java11才可以&#xff0c;我本机使用的是Java8&#xff0c;所以暂时不做调整。第二种是通过docker安装。 1.1 启…

if条件语句

if条件语句 条件测试 test 测试表达式是否成立&#xff0c;若成立返回0&#xff0c;否则返回其他数值 格式1 &#xff1a;test 条件表达式&#xff1b;格式2 &#xff1a;[ 条件表达式 ] echo $?参数作用-d测试是否为目录 (Directory)-e测试目录或文件是否存在(Exist)-f测…

【java笔记】java多线程

目录 一、概念 1.1 什么是进程&#xff1f; 1.2 什么是线程&#xff1f; 1.3 什么事多线程&#xff1f; 1.4 进程和线程的关系 二、线程对象的生命周期 三、实现线程有两种方式 3.1 继承 java.lang.Thread&#xff0c;重写 run方法 3.2 实现 java.lang.Runnable 接口…

八、vue_options之computed、watch属性选项

一、computed计算属性使用 &#xff08;1&#xff09;复杂data的处理方式 &#xff08;2&#xff09;computed 计算属性 computed计算属性初体验&#xff1a; 在我们通过Vue调用createApp方法传入一个对象的时候&#xff0c;我们之前写了data属性、methods属性&#xff0c;这…

HTB-Time

HTB-Time 信息收集80端口 立足pericles -> root 信息收集 80端口 有两个功能&#xff0c;一个是美化JSON数据。 一个是验证JSON&#xff0c;并且输入{“abc”:“abc”}之类的会出现报错。 Validation failed: Unhandled Java exception: com.fasterxml.jackson.core.JsonPa…

低代码是开发的未来,还是只能解决边角问题的鸡肋?

随着互联网行业寒冬期的到来&#xff0c;降本增效、开源节流几乎成为了全球互联网厂商共同的应对措施&#xff0c;甚至高薪酬程序员的“35岁危机”一下子似乎变成了现实。程序员的高薪吸引了各行各业的“跨界选手”&#xff0c;是编程门槛降低了吗&#xff1f;不全是&#xff0…

Linux Ansible管理变量、管理事实、管理机密

目录 Ansible变量 变量定义范围 变量类型 定义变量并引用 事实变量与魔法变量 事实变量 魔法变量 Ansible加密 ansible-vault参数 ansible-vault举例 Ansible变量 Ansible支持利用变量来存储值&#xff0c;并且可以在Ansible项目的所有文件中重复使用这些值 变量可能…

Hadoop3.2.4+Hive3.1.2+sqoop1.4.7安装部署

目录 一、软件包 二、JDK部署 1.JDK解压 2.设置环境变量 3.环境验证 4.分发JDK相关文件至Node_02、Node_03 5.环境生效 三、Zookeeper部署 1.Zookeeper解压 2.Zookeeper配置 3.创建myid文件 4.设置环境变量并添加映射 5.分发ZooKeeper 相关文件至Node_02、Node_0…

Qt — Graphics/View框架

文章目录 前言一、Qt图形系统介绍二、Graphics/View框架 前言 Qt的Graphics/View框架被用来存放、显示二维图形元素&#xff0c;处理那些对图形元素进行操作的交互命令。 一、Qt图形系统介绍 Qt 应用程序的图形界面包含各种控件&#xff0c;比如窗口、按钮、滚动条等。所有这…

【单目标优化算法】沙猫群优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

4月24日~4月26日学习总结

一&#xff0c;刷题目情况&#xff0c;已经完成了8道题目&#xff0c;对于其中一些题目做一下题解。 这个题目的意思是找到的两个位置l和r&#xff0c;为了做到这个数组的l到r的子数组经过排序后&#xff0c;会变成输入的另外一个数组&#xff0c;这个题目的思路就是首先找到在…

服务(第十篇)Nginx和tomcat反向代理(动静分离)

正向代理&#xff1a; 当用户想访问某一网址时&#xff0c;用户先访问代理服务器&#xff0c;然后由代理服务器向目标网址发送请求最终将数据返回代理服务器&#xff0c;最后代理服务器将数据返回给用户这一过程我们称之为正向代理。 反向代理&#xff1a;基本流程是与正向代理…

(04)基础强化:接口,类型转换cast/convert,异常处理,传参params/ref/out,判断同一对象

一、复习 1、New的截断是指什么&#xff1f; new除了新开空间创建初始化对象外&#xff0c;还有一个隐藏父类同名方法的作用。 当子类想要隐藏父类同名的方法时用new&#xff0c;用了new后父类同名方法将到此为止&#xff0c;后面 继承的…

centos7部署FastDFS服务

一、安装需要的相关依赖 yum -y install make cmake gcc gcc-c 因为我的服务器已经安装了gcc&#xff0c;所以略去 使用gcc -v查看版本 yum -y install zip unzip 安装性能事件通知库 yum -y install libevent 安装nginx依赖 yum -y install libevent yum -y install zli…

最新版TensorFlow的GPU版本不支持原生Windows系统(大坑预警)

一、前言 首先需要说明&#xff0c;按照官方中文文档安装是无法正常检测到GPU的。因为TensorFlow 2.10是支持原生Windows系统GPU环境的最后版本&#xff0c;默认安装的版本都比较高。 中文文档没有说明&#xff0c;英文文档是有提到的&#xff1a; &#xff08;我在GitHub上找…

操作系统之进程同步和互斥

目录 什么是进程同步和进程互斥 进程互斥的软件实现方法 进程互斥的硬件实现方法 互斥锁 信号量机制 用信号量实现进程互斥和同步 生产者消费者问题 多生产者多消费者问题 吸烟者问题 读者写者问题 哲学家进餐问题 管程 死锁 什么是进程同步和进程互斥 进程同步 进…

Scala之模式匹配与隐式转换

目录 模式匹配&#xff1a; 基础语法如下&#xff1a; 模式守卫&#xff1a; 类型匹配&#xff1a; 对象匹配 样例类&#xff1a; 偏函数&#xff1a; 偏函数的化简写法&#xff1a; 偏函数的使用&#xff1a; 隐式转换&#xff1a; 官方定义&#xff1a; 个人理解&…

Linux-使用mobaxterm连接虚拟机ubuntu

一、准备工作 VMware&#xff1a;16.0.0 Ubuntu&#xff1a;18.4 MobaxTerm&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1dNsahe9wO5KrWlWXtNqT0A?pwdaz39 提取码&#xff1a;az39 二、实操 1.检查系统是否安装ssh service sshd status 如果显示未安装&#xff0…

基于MATLAB实现WSN(无线传感器网络)的LEACH(低能耗自适应集群层次结构)(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 低能耗自适应集群层次结构&#xff08;“LEACH”&#xff09;是一种基于 TDMA 的 MAC 协议&#xff0c;它与无线传感器网络 &a…