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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux上nginx配置SSL协议非80、443端口自动跳往https端口

    Linux上nginx配置SSL协议非80、443端口自动跳往https端口在生产环境中往往碰到一个网站需要多个访问端口,而默认的http访问端口是80,https访问的端口是443,然而这是不够在生产环境下使用的,这个时候就需要配置更多的端口来弥补这一缺点。默认情况下用户输入URL时是约简单越好,比如http://baidu.com,用户只需要输入baidu.com就可以访问。但是这样是通过http协议进行访问,而并非https进行访问。站在用户的角度来考虑问题他不…

    2022年6月22日
    120
  • java笛卡尔积算法_Java 笛卡尔积算法的简单实现

    java笛卡尔积算法_Java 笛卡尔积算法的简单实现笛卡尔积算法的Java实现:(1)循环内,每次只有一列向下移一个单元格,就是CounterIndex指向的那列。(2)如果该列到尾部了,则这列index重置为0,而CounterIndex则指向前一列,相当于进位,把前列的index加一。(3)最后,由生成的行数来控制退出循环。publicclassTest{privatestaticString[]aa={“aa1”,”aa2…

    2022年7月27日
    25
  • python处理json文件_python打开json文件 如何用python读取json文件里指定的数据

    python处理json文件_python打开json文件 如何用python读取json文件里指定的数据如何用 python 读取 json 文件里指定的数据爱一个人从来都是这样 明明想要月亮 但是却只能得到月光 JSON 文件 who json 内容如下 name mss version 1 0 0 deimportjson who json r asf data json load f dependencies data depe

    2025年10月22日
    4
  • 掉坑了!GROUP_CONCAT函数引发的线上问题

    怕什么真理无穷,进一步有近一步的欢喜本文分享一篇在工作遇到的一个问题,关于MySQL GROUP_CONCAT函数导致的问题。希望能帮忙到你。开头聊几句一年又一年,2020这一年眼看就要…

    2022年3月1日
    69
  • 哈佛幸福课笔记[通俗易懂]

    哈佛幸福课笔记[通俗易懂]第一课什么是积极心理学1、快乐由精神状态决定,而不是社会地位和银行存款2、成功的两个因素:相信自己、保持好奇不断学习第二课为什么要学习积极心理学1、你所问的问题决定了你的感受,当一个人总是问自己:我的弱点是什么?我如何做的更好?他会忽略自己的优点,认为优点是不存在的2、从专注缺点到专注优点3、做一个行动者,行动可以增加自信,而不是一个被动者抱怨者第三课幸福是一…

    2022年7月25日
    14
  • 激活成功教程芝诺悖论之阿基里斯追乌龟

    激活成功教程芝诺悖论之阿基里斯追乌龟版权所有。所有权利保留。欢迎转载,转载时请注明出处:阿基里斯是古希腊神话中善跑的英雄。在他和乌龟的竞赛中,他速度v1,位置坐标0;乌龟速度v2,位置坐标s。已知v1>v2。他在后面追,但他不可能追上乌龟。因为在竞赛中,追者首先必须到达被追者的出发点,当阿基里斯追到s时,乌龟已经又向前爬了s/v1*v2,位置s+s/v1*v2。于是,一个新的起点产生了;阿基里斯必须继续追,而当他追到乌龟爬的

    2022年6月23日
    35

发表回复

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

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