sizeof和strlen的区别及使用详解

sizeof和strlen的区别及使用详解首先我们来看一下sizeof和strlen的区别:sizeof操作符的结果类型为size_t(Thesizeofkeywordgivestheamountofstorage,inbytes,associatedwithavariableoratype(includingaggregatetypes).Thiskeywordreturnsaval…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

首先我们来看一下sizeof和strlen的区别:

  • sizeof操作符的结果类型为size_t(The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.)(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。

  • sizeof是运算符,可以以类型、函数、做参数 。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’(通过strlen的实现得知)。

  • sizeof是在编译的时候就将结果计算出来了是类型所占空间的字节数,所以以数组名做参数时计算的是整个数组的大小。而strlen是在运行的时候才开始计算结果,这是计算的结果不再是类型所占内存的大小,数组名就退化为指针了。

  • 另外,sizeof不能计算动态分配空间的大小如:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
   char str[20] = "hello world";
   char *s = (char *)malloc(20);
   strcpy(s, str);
   printf("strlen(str)=%d\n",strlen(str));
   printf("sizeof(str)=%d\n",sizeof(str));
   printf("strlen(s)=%d\n",strlen(s));
   printf("sizeof(s)=%d\n",sizeof(s));
   free(s);
   return 0;
}

Jetbrains全家桶1年46,售后保障稳定

结果为:
这里写图片描述

  • 最后的sizeof计算的是指针(sizeof(char *)) 的大小,为4。当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。

下面我们来看一看sizeof和strlen的具体使用:

  • 首先看几个例子 :
    • 第一个例子:
char* s = "0123456789";
sizeof(s);     //结果 4    ===》s是指向字符串常量的字符指针
sizeof(*s);    //结果 1    ===》*s是第一个字符
strlen(s);     //结果 10   ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
strlen(*s);     //结果 10   ===》错误


char s[] = "0123456789";
sizeof(s);     //结果 11   ===》s是数组,计算到\0位置,因此是101
strlen(s);     //结果 10   ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
sizeof(*s);    //结果 1    ===》*s是第一个字符

char s[100] = "0123456789";
sizeof(s);     //结果是100 ===》s表示在内存中的大小 100×1
strlen(s);     //结果是10  ===》strlen是个函数内部实现是用一个循环计算到\0为止之前

int s[100] = "0123456789";
sizeof(s);     //结果 400  ===》s表示再内存中的大小 100×4
strlen(s);     //错误      ===》strlen的参数只能是char* 且必须是以‘\0‘结尾的

char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);\\结果是 4 3 3 2

char p[] = {
  
  'a','b','c','d','e','f','g','h'};
char q[] = {
  
  'a','b','c','d,'\0','e','f','g'}; sizeof(p); //结果是8 ===》p表示在内存中的大小 8×1 strlen(p); //为一个随机值,结果与编译器有关,不同编译器结果一般不同 sizeof(q); //结果是8 ===》p表示在内存中的大小 8×1 strlen(q); //结果为4 ===》存在'\0',遇到'\0'计算停止。 
  • 第二个例子

    struct Stu
    {
    int i;
    int j;
    char k;
    };
    Stu stu;
    printf"%d\n",sizeof(Stu));  //结果 12 ===》内存补齐
    printf"%d\n",sizeof(stu));;  //结果 12 ===》内存补齐 
    • 这个例子是结构体的内存对齐所导致的,计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C语言在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便,如有不理解的可以看看另外关于一篇内存对齐的博客。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210424.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月26日 上午11:43
下一篇 2025年7月26日 下午12:15


相关推荐

  • Linux上Oracle 11g安装步骤图解

    Linux上Oracle 11g安装步骤图解Linux系统中安装oracle11g,图文并茂,并提供一些常见的错误处理方法!!

    2022年7月2日
    48
  • js 数组删除指定元素「建议收藏」

    js 数组删除指定元素「建议收藏」js数组删除指定元素,js数组并没有提供直接删除某一指定元素的方法,因此需要我们稍作处理思路:首先找到要删除的元素的位置,然后使用splice方法进行删除示例代码删除数组s中的‘dd’元素vars=[‘s’,’dd’,’re’]s.splice(s.indexOf(‘dd’),1)console.log(s)运行效果至此完…

    2022年8月11日
    8
  • Json对象和Json字符串以及js对象(JavaScript对象)的区别

    Json对象和Json字符串以及js对象(JavaScript对象)的区别1 Json 概念概念 JSON JavaScriptOb 一种简单的数据格式 是一种比较轻量级的数据存储格式 2 Json 与 JS 对象的对比区别 JSONJavaScri 含义数据格式类实例传输可以跨平台数据传输 速度快类实例表现 1 键值对的方式 属性必须加双引号键值对的方式 属性不加双引号表现 2 值不可以是方法函数 undefined 以及 NAN 值可以是函数 对象 字符串 数字 boolean 等相互转换 1

    2026年3月19日
    3
  • LSTM详解 反向传播公式推导[通俗易懂]

    LSTM详解 反向传播公式推导[通俗易懂]部分参考:http://colah.github.io/posts/2015-08-Understanding-LSTMs/1.结构1.1比较RNN:LSTM:其中的notation:1.2核心思想:LSTM在原来的隐藏层上增加了一个ThekeytoLSTMsisthecellstate,thehorizont…

    2022年5月10日
    47
  • 国内开发者接入Nano Banana Pro API教程 0.09/张不仅便宜稳定性强的可怕

    国内开发者接入Nano Banana Pro API教程 0.09/张不仅便宜稳定性强的可怕

    2026年3月13日
    2
  • Redis 雪崩和击穿

    Redis 雪崩和击穿缓存雪崩缓存雪崩是指在同一时间段大量的缓存 key 同时失效或者 Redis 服务宕机 导致大量请求到达数据库 带来巨大压力 解决方案 给不同的 key 的 TTL 添加随机值利用 Redis 集群提高服务的可用性给缓存业务添加将降级限流策略给业务添加多级缓存缓存击穿缓存击穿问题也叫热点 key 问题 就是一个被高并发并且缓存重建业务较复杂的 key 突然失效了 无数的请求访问会瞬间给数据库带来巨大的冲击 例如一个人查询数据库重建缓存数据 在缓存数据还没有写入数据库的时候其它的人也对进行重复

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号