精华内容
下载资源
问答
  • sizeof的小陷阱
    2019-02-23 21:11:57

    int main() 

    int i=1; 
    printf(“%d,%d\n”,sizeof(++i),i); 
    return 0;


    知识点在于关键字sizeof(i++),由于sizeof()是计算内存大小,对立面的变量数值不会改变,并且立面的运算不会成立,因此i++没有执行,所以i不变。

    更多相关内容
  • sizeof遇到’\0把它的长度算进去,而strlen不会把’\0’算进去,而是到‘\0’就停止计算。 例如 #include<iostream> #include<cstring> #include<string> using namespace std; int main...
    1. sizeof函数是求表达式或者类型的字节数的,strlen是求字符串的长度的。sizeof遇到’\0’会把它的长度算进去,而strlen不会把’\0’算进去,而是到‘\0’就停止计算。
    2. 例如
    #include<iostream>
    #include<cstring>
    #include<string>
    using namespace std;
    
    int main()
    {
        char str1[]={'h','e','l','l','o','\0','g'};
        int len1=sizeof(str1);
    
        int len2=strlen(str1);
    
        cout<<"len1:"<<len1<<"\nlen2:"<<len2<<endl;
        return 0;
    
    }
    

    它的运行结果如下
    在这里插入图片描述

    展开全文
  • string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。 结论:不要把sizeof当成函数,也...

    string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。

    结论:不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。

    在需要求string类型的字符串长度时,只能用.length()或.size()的函数,可返回字符串中字符的个数,不包括结束符‘\0’。

    strlen()函数

    在求用字符数组表示的字符串的长度时,可用strlen()函数
    strlen(ptr) 的执行机理是:从参数ptr所指向的内存开始向下计数,直到内存中的内容是全0(即’\0’)为止(不会对’\0’进行计数)。用strlen测量字符串的长度,其实就是基于这个原理。

    为了验证,我输入了如下程序:
    在这里插入图片描述
    可得到如下结果:
    在这里插入图片描述
    sizeof(name)的执行机理是:

    如果name是一个类型名

    得到的是该类型的大小(所谓类型的大小,指的是:如果存在一个该类型的变量,这个变量在内存中所占用的字节数),

    如果name是一个变量名

    那么,sizeof(name)并不会真正访问该变量,而是先获知该变量的类型,然后再返回该类型的大小(即便是struct这样的复杂类型,编译器在编译时也会根据它的各个域记录其大小,所以,由类型得到类型大小,不是一件难事)。换句话说,本质上,sizeof的运算对象是类型。

    再看如下的例子:
    cout<<sizeof(string*)<<endl; // 4
    cout<<sizeof(int*)<<endl; // 4
    cout<<sizof(char****)<<endl; // 4
    int *d = new int[10];
    cout<<sizeof(d)<<endl; // 4

    d是我们常说的动态数组,但是他实质上还是一个指针,所以sizeof(d)的值是4。
    可以看到,不管是什么类型的指针,大小都是4的,因为指针就是32位的物理地址。
    

    再考虑下面的问题:

    double* (*a)[3][6];
    cout<<sizeof(a)<<endl; // 4
    cout<<sizeof(*a)<<endl; // 72
    cout<<sizeof(**a)<<endl; // 24
    cout<<sizeof(***a)<<endl; // 4
    cout<<sizeof(****a)<<endl; // 8

    a是一个很奇怪的定义,他表示一个指向 double*[3][6]类型数组的指针。
    既然是指针,所以sizeof(a)就是4。
    既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,
    因此sizeof(*a)=3*6*sizeof(double*)=72。同样的,**a表示一个double*[6]类型
    的数组,所以sizeof(**a)=6*sizeof(double*)=24。
    ***a就表示其中的一个元素,也就是double*了,所以sizeof(***a)=4。
    至于****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8。
    

    结论:只要是指针,大小就是4。(64位机上要变成8也不一定)。

    数组名作为形参

    a.

    char str[] = “abc”;
    printf("%d %d\n", sizeof(str), strlen(str)); //4 3
    这里,是 用数组的形式声明字符串,编译器会自动在字符串后面加上’\0’,所以,数组的元素个数是4而不是3 。对于sizeof(str)而言,sizeof将str视为char [4]l类型的变量,所以,sizeof(str)的结果就是整个数组所占有的空间大小。对于strlen(str)来说,它从str指向的内存开始计数,直到遇到全0的内存(’\0’),所以最后得到结果3。

    b.

    char str1[10] = “abc”;
    printf("%d %d\n", sizeof(str1), strlen(str1)); //10 3

    编译器为char str1[10]分配10个数组元素大小的空间,这与初始化它的字符串没有关系,所以sizeof(str1)得到10。

    c.

    char dog[] = “wangwang\0miao”;
    printf("%d %d\n", sizeof(dog), strlen(dog)); //14 8
    testchar(dog); //4 8
    前两句和a中的情况相同,sizeof(dog)输出整个数组所占的内存大小(包括编译器加上去的’\0’),strlen(dog)遇到’\0’就停止,所以输出8。

    再看后面的函数调用,数组名dog作为函数实参传入,我们再来回顾一下testchar函数

    void testchar(char str[])
    {
    printf("%d %d\n", sizeof(str), strlen(str));
    }
    我们发现,这里sizeof(str)并没有像sizeof(dog)那样得到14,而是得到了4。这是因为,str是函数形参,尽管它是以数组名的形式出现的,传给它的实参也确实是数组名,但sizeof仅仅把它当成一个char*类型的指针看待,所以,sizeof(str)的结果就是char *类型所占的空间4。至于strlen(str),我们前面说过,它执行的机理就是从str指向的内存开始向下计数,直到遇到’\0’,所以依然得到8。
    d.

    int arr[10] = { 0 };
    printf("%d %d\n", sizeof(arr), sizeof(arr[11])); //40 4
    testint(arr); //4
    前面说过, 当数组名作为函数形参出现时,sizeof仅仅将其视为一个指针,否则,sizeof认为它代表整个数组,所以,sizeof(arr)得到整个数组所占的字节数40,而testint(arr)的结果是int*类型的指针的长度4。

    部分参考博文:https://www.cnblogs.com/zpcdbky/p/5857656.html

    展开全文
  • strlen /sizeof/ 0,'\0','0'中的陷阱

    千次阅读 2016-09-03 21:13:57
    #include #include main() ... printf("%d %d\n",sizeof(x),strlen(x)); }  结果为7,0   一旦char[]="STRING",这时候分配的内存7字节,之后无论怎么修改如何赋值都不会改变 字符串是借助于字符
    #include<stdio.h>
    #include<string.h>
    
    main()
    {
    	char x[]="STRING";
    	x[0]=0; x[1]='\0';x[2]='0';
    	printf("%d %d\n",sizeof(x),strlen(x));
    	
    }
    
      结果为7,0
     
    一旦char[]= "STRING",这时候分配的内存7字节,之后无论怎么修改如何赋值都不会改变


    字符串是借助于字符型一维数组来存放的,'\0'ASCLL代码值为0,它作为标志占用存储空间但不记入串的实际长度,所以用来作为字符串的结束标志
    所以数字0跟'\0'的效果一样 

    #include<stdio.h>
    #include <string.h>
    
    int main(void)
    
    {
    	char p[]="123067";
    	
    	printf("%d\n",strlen(p));               //结果为6
    	
    	p[3]=0;
    	
    	printf("%d\n",strlen(p));              //结果为3字符串是借助于字符型一维数组来存放的,'\0'ASCLL代码值为0,它作为标志占用存储空间但不记入串的实际长度,
    	                                       // 所以用来作为字符串的结束标志 ,所以数字0跟'\0'的效果一样 
    	return 0;
    }


    展开全文
  • sizeof用法总结

    2017-01-20 13:42:27
    sizeof在C语言中经常遇到,但它的用法和注意事项很多人都没在意过,我通过翻很多人的博客以及自己的理解总结出sizeof常见的用法。  首先应该澄清sizeof是运算符而不是函数,这就是和strlen()本质的区别了,strlen...
  • 简介 关键词sizeof
  • sizeof和strlen都是用来求字符串的长度。 区别 sizeof是一个单目运算符,不是函数!它的参数可以是数组、指针、数据类型名,函数等等。 而strlen是一个函数,它的参数只能是数据! 证明如下: 代码如下: #...
  • int main() ... memset(&a, 0, sizeof(a)); // 0000 0001 0000 0001 0000 0001 0000 0001 memset(&a, 1, sizeof(a)); //给每一个字节设置指定的数 printf("a = %d\n", a); int b[100]; mems
  • sizeof 是C 语言的一种单目运算符,如++、--等,并不是函数,sizeof 的优先级为2 级,比/、% 等3 级运算符优先级高,sizeof以字节的形式给出操作数的存储空间的大小。而 strlen 是一个函数,是由 C 语言的标准库提供...
  • C语言sizeof与strlen详解(附大量笔试题题解过程)

    千次阅读 多人点赞 2021-09-10 11:51:47
    一.sizeof()详解 二.strlen()详解 strlen()的模拟实现: 法1:计数器 法2:指针-指针 法3:递归 三.strlen与sizeof的区别 四.笔试题 1.整形数组int a[] = {1,2,3,4} strlen()相关题目 sizeof()相关...
  • 如下字符数组or字符串,用strlen函数求长度各是多少? char * p = “abc” 与 char a[] = &amp;amp;quot;abc&amp;amp;quot;两种形式并不同; char * str1 = &...ab\0c&amp;amp;quot;;
  • sizeof

    2015-09-11 14:37:36
    /*********************...计算的是字符串的长度,遇到‘\0‘即停止sizeof (ss4) 结果为400,ss4表示在内存中的大小, strlen (ss4) 出错 , stelen参数必须是char * 类型,且必须是以‘\0’结尾的。
  • sizeof()用法总结

    千次阅读 2021-02-12 19:50:10
    1. 定义:sizeof作用就是返回一个对象或者类型所占的内存字节数。它不是一个函数,其字节数的计算在程序编译时进行的。2. 语法格式:(1)用于数据类型,使用形式: sizeof(type)数据类型必须用括号括住。sizeof(int)(2...
  • 为了测试我的代码(目前可以很好地分配空间),我使用了:char* ptr = my_malloc(6*sizeof(char));memcpy(ptr,"Hello", 6*sizeof(char));printf("%s", ptr);输出通常是这样的:HelloUnprintable character一些调试...
  • sizeof()

    2021-09-24 16:46:07
    前段时间和同事讨论这个sizeof(),今天跑了一下记录下来; #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char str1[] = "Hello"; str1[2] = 'a'; printf("%s\n", ...
  • strlen和sizeof的区别

    多人点赞 热门讨论 2022-04-05 09:28:19
    相信大多数初步了解C语言的小伙伴们,应该对strlen和sizeof都不陌生,但是在使用时总会出现或多或少的疑问,我将用这一篇博客解决困扰大家许久的问题(仅此一篇你就了解的透彻),请耐心阅读!!! 在深究strlen...
  • 在定义了数组大小时:sizeof是运算符,...在未定义数组大小时:sizeof根据实际位数确定,注意字符串隐藏的\0也算一位,。eg:1char s[] = "a\128\\\tcb\xdg\n";sizeof计算s大小时,为11位:a \12 8 \\ \t c b \xd ...
  • c++中sizeof()运算符的的深入理解

    千次阅读 2020-07-19 18:33:30
    简 述: 对 C / C++ 中的 sizeof() 运算符的一些深入思考; 背景: 昨晚看到一题,虽然可以轻易得到结果,但是突然深入思考一些,这是为什么? #include <stdio.h> #include <string.h> int main(int...
  • size_t是无符号的,并且与平台无关,表示0-MAXINT的范围 size_t是标准规定的一个同义词,它的定义放在stddef.h里面,不同的环境下, 可以是 typedef unsigned size_t; 也可以是 typedef unsigned long size_
  • strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它从aa首地址一直找下去,直到遇到'\0'停止。strlen返回的是有效字符串长度,不...
  • c++中sizeof()的用法和注意事项
  • 详解strlen和sizeof在数组的中的使用(一)

    多人点赞 热门讨论 2021-09-16 17:02:15
    1.sizeof是一个操作符,不需要引头文件,形式一般是sizeof(变量或表达式),计算的是 所占的空间大小。单位是字节,所以他可以计算任意类型的大小。 2.strlen我们相当熟悉,strlen是字符串函数,要引出头文件<...
  • 【C语言】sizeof与strlen

    热门讨论 2021-05-23 14:14:00
    strlen函数求的是字符串的实际长度,它求得方法是从 开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它从首地址一直找下 去,直到遇到'\0'停止。而如果不在字符数组初始化的时候加上\0,...
  • 求数组长度:1、sizeof()关键字:根据sizeof ()关键字可以获得参数(数组、指针、数据类型、对象或者函数)在内存中所占的字节数,所以数组所占总的字节数除以一个元素所占的字节数就是数组的长度。如下代码所示,数组...
  • strlen与sizeof的区别

    2022-02-07 09:18:44
    sizeof()是一个单目运算符,也是关键词之一,使用的话,不需要引用头文件 strlen()是一个函数,使用的话需要引用头文件-#include "string.h" 2.sizeof可以用于做参数,它的参数可以是数组、指针、类型、对象、...
  • sizeof和strlen的区别

    2020-12-08 10:19:03
    int a[] = {1,2,3,4}; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a+1)); printf("%d\n",sizeof(&a)); printf("%d\n",sizeof(*&...printf("%d\n", sizeof(arr+0)); printf("%d\n", st
  • sizeof和strlen的实列 int a[] = { 1,2,3,4 }; //sizeof判断元素所占的空间的字节 //printf("...//数组名a+0之后被隐式转换位指针,//32位系统下,为4 printf("%d\n", size...
  • 【C++】strlen 和sizeof 的区别(小结)

    千次阅读 多人点赞 2019-04-23 22:18:17
    strlen和sizeof 区别 一、sizeof 运算符:计算所占的字节大小 sizeof()是运算符,其值在编译时 就已经计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节...
  • C++之sizeof与strlen

    2019-10-13 16:20:45
    title: C/C++之sizeof与strlen author: Qian Jipeng tags: sizeof strlen 内存对齐 C++成员布局 ...很久之前的C课程上面老师就提到过sizeof,当时也不知道是怎么一回事,后来在读代码的过程中经常遇到si...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,873
精华内容 6,749
关键字:

sizeof遇到\0会停止吗