首页 > 其他分享 >sizeof与strlen的彻底比较

sizeof与strlen的彻底比较

时间:2022-10-26 14:34:23浏览次数:37  
标签:str 彻底 数组 printf sizeof strlen size

目录

一、sizeof

1、本质
单目运算符,目的是获取变量或类型占用的存储空间(单位:字节)。

2、原型
入参:类型、变量名;
出参:size_t,即unsigned int

3、原理:指针偏移
非数组:#define _sizeof(T) ((size_t)((T*)0 + 1))
数组:#define array_sizeof(T) ( (size_t)(&T+1) - (size_t)(&T) )

4、作用阶段:
编译时(内部的赋值等语句的副作用不会发生,如sizeof(i++))

5、注意事项:
(1)不能计算动态分配空间的大小;
(2)作用于数组,编译时分配的数组空间大小;作用于类型,该类型所占空间大小;作用于指针,存储该指针所用空间的大小;作用于函数,决定于函数的返回值类型大小;(仅需要区分数组与类型,指针与函数是类型的特例)
(3)sizeof 作用于结构体,基本类型相加,注意字节对齐;
(4)各类型占用的空间大小与操作系统有关;
(5)C99特性,变长数组在运行时计算数组长度

二、strlen

1、本质:标准库函数,目的是获取字符串的字符个数(不包括结束符,单位:个)。

2、原型:
头文件:string.h
原型:size_t strlen(char const* str);

3、原理:
遍历计数,以结束符为截止条件:

size_t strlen(char const* str)
{
size_t ret = 0;
while(*str++) {
    ret++;
}
    return ret;
}

4、作用阶段:运行时

5、注意事项:
(1)函数仅统计从字符串起始位置到’\0’为止的字符个数,正确计算时要求字符串有结束符,并且如果字符串中有多个结束符,仅计算到第一个结束符。
(2)仅计算字符个数,与操作系统无关;

三、sizeof数组长度计算说明

(1)计算公式:#define array_sizeof(T) ((size_t)(&T+1) - (size_t)(&T))

假设数组a[100],a和 &a结果都是数组的首地址,但其类型不一样:
a表示&a[0],即对数组首元素取地址,a+1表示首地址+sizeof(元素类型);
&a尽管值为数组首元素地址,但类型为:类型 (*)[数组元素个数],&a+1大小为:首地址+sizeof(a)。

因此,&T+1指针将会指到数组的末尾,尾地址减去首地址,得出的正是数组的大小。

验证实例:

#include<stdio.h>
#include<string.h>

#define sizeof_type(T) ((size_t)((T*)0 + 1))

int main()
{
    char str[]="hello";
    char *p = str;

    printf("str_p=%p, &str_p=%p\n", str, &str);
    printf("str_p+1=%p, &str_p+1=%p\n", str + 1, &str + 1);
    printf("str_mem=%d, p_mem=%d\n", sizeof(str), sizeof(p));

    printf("str_len=%d, p_len=%d\n", strlen(str), strlen(p));

    printf("sizeof_int=%d, my_sizeof_len=%d\n", sizeof(int), sizeof_type(int));

    printf("sizeof_type=%d\n", ((size_t)((int*)0 + 1)));

    printf("sizeof_p=%p\n", (double*)0);
    printf("sizeof_p=%p\n", (double*)0 + 1);

	return 0;
} 

标签:str,彻底,数组,printf,sizeof,strlen,size
From: https://www.cnblogs.com/HZL2017/p/16828264.html

相关文章

  • 通过一个例子让你彻底掌握 Go 工作区模式
    通过一个例子让你彻底掌握Go工作区模式站长polaris Go语言中文网 2022-10-2608:52 发表于北京 阅读本文大概需要5分钟。大家好,我是polarisxu。早在Go1.18......
  • 彻底理解闭包实现原理
    前言闭包对于一个长期写Java的开发者来说估计鲜有耳闻,我在写Python和Go之前也是没怎么了解,光这名字感觉就有点"神秘莫测",这篇文章的主要目的就是从编译器的角度来......
  • c语言strlen(c语言strlen计算空格吗)
    c语言里面的strlen是干什么的strlen()是计算字符串长度的函数,将返回从字符串首到'\0'之间总共的字符个数,原型为:externunsignedintstrlen(char*s);所以除非你的a[0]本身......
  • 彻底学会Selenium元素定位
    转载请注明出处❤️作者:测试蔡坨坨原文链接:caituotuo.top/63099961.html你好,我是测试蔡坨坨。最近收到不少初学UI自动化测试的小伙伴私信,对于元素的定位还是有些头疼,总......
  • WordPress彻底禁用上传媒体图片自动生成缩略图及多尺寸图片(亲测可用)
    WordPress默认上传图片的时候会自动生成缩略图及多尺寸的图片文件,大部分网站都用不到这些多余的图片,不仅仅占用空间,而且上传的时候还会消耗额外的性能。下面仅需两段函数......
  • 一文彻底搞懂前端缓存机制
    浏览器缓存步骤1)浏览器在加载资源时,先根据这个资源的一些httpheader判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务器。比如某个......
  • 监控系统的建设思路,彻底找出性能瓶颈
    一、起始一个好的监控系统,不仅可以实时暴露系统的各种问题,更可以根据这些监控到的状态,自动分析和定位大致的瓶颈来源,从而更精确地把问题汇报给相关团队处理。要做好监控,最......
  • 老旧系统改造,彻底重构还是给老系统减负?
    编 辑:彭文华周末跟一位老彭友约了在了一个景色非常优美的地方私聊,没想到一下就聊了3个多小时。跟企业实战大佬毫无保留的深入探讨一个问题,真的非常酣畅淋漓,太过瘾了!​这次......
  • 彻底搞懂Ajax,Promise,Axios
    一、ajaxAJAX:异步JavaScript和XML,用来发送异步请求。有了Ajax之后,在无需重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。 Ajax是基于现有的Int......
  • 宋宝华: 关于Linux进程优先级数字混乱的彻底澄清
    找了好久终于找到你了,这是网上关于优先级描述最清晰的一个帖子。没有之一。必须转发。                所以从上面的描述来说,先是区分调......