C语言 sizeof, size_t, strlen

news/2024/11/29 5:27:23/

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.ppmy.cn/news/52092.html

相关文章

第六届中国软件开源创新大赛——飞桨赛题新鲜出炉,速来pick!

最近想要充个电&#x1f50b; 飞桨邀你开启开源贡献之旅 寻找那个最“会”的你 顶级开源项目、资深研发指导、高阶开发者合作交流&#xff0c;‍‍ Buff 叠满&#xff01; 技能提升、丰富简历、高额奖金&#xff0c; 你还不心动&#xff1f; 赛事简介 中国软件开源创新大赛已成…

Vue之指令详解与自定义指令

指令 想要了解自定义指令&#xff0c;那肯定得先明白什么是指令。 指令的本质&#xff1a;语法糖&#xff0c;标志位。在编译阶段 render 函数里&#xff0c;会把指令编译成 JavaScript 代码。 常见的Vue内置指令有&#xff1a; v-on 即 。v-on:click”function“&#xff…

C++ 类和对象(上)

类 面向对象的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。比如&#xff1a; 之前在数据结构初阶中&#xff0c;用C语言方式实现的栈&#xff0c;…

JavaScript每日五题面试题(第九天)

1、你如何理解Promise&#xff1f; Promise是异步编程的一种解决方案&#xff0c;它是一个对象&#xff0c;可以获取异步操作的消息&#xff0c;他的出现大大改善了异步编程的困境&#xff0c;避免了地狱回调&#xff0c;它比传统的解决方案回调函数和事件更合理和更强大。 2…

数据结构——单链表

目录 1.问题引出 &#xff1a; 2.单链表的出现&#xff1a; 2.1单链表的增添&#xff1a; 2.1.1&#xff1a;尾插 2.1.2&#xff1a;头插 2.1.3&#xff1a;任意插入 2.2&#xff1a;单链表的删除 2.2.1&#xff1a;尾删 2.2.2&#xff1a;头删 2.2.3&#xff1a;任…

022:Mapbox GL 加载geojson数据,形成热力图,自定义样式

第022个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载geojson数据,形成热力图. paint设置的参数:heatmap-color,heatmap-intensity,heatmap-opacity,heatmap-radius,heatmap-weight,visibility,具体请参考下面的api链接。 直接复制下面的 vue+mapbox源代…

Ddocker cgroups资源限制

目录 一、概述 1、简介 2、cgroups四大功能 3、cpu时间片概念 二、查看容器的默认CPU使用限制 1、进行CPU压力测试 三、创建容器时设置CPU使用时间限制 四、设置CPU资源占用比&#xff08;设置多个容器时才有效 1、分别进入容器进行压测 查看容器运行状态 五、设置容器…

STM32开发(十七)STM32F103 片内资源 —— 独立看门狗 IWDG 详解

文章目录 一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示 一、基础知识点 STM32F10xxx内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引…