忘记360手机路由器卫士忘记密码里的图形程序锁的密码怎么办?而且360我设置了无法卸载,并且也不记得有没有设置过

sizeof探测类型,strlen字符串长
服务器君一共花费了81.090 ms进行了3次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议
1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2. sizeof是运算符(C++ 关键字),strlen是函数。
3. 可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。sizeof还可以用函数做参数,比如:
short f();
printf("%d\n", sizeof(f()));
输出的结果是返回值的类型的大小, 即sizeof(short)=2。
4. 数组做sizeof的参数不退化,传递给就退化为指针了。大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。
char str[20]="";
int a=strlen(str); //a=10;
int b=sizeof(str); //b=20;
而strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
5. sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
6. 当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 得到全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。
7. 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:
fun(char [8])
fun(char [])
都等价于 fun(char *)。
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsiged char *p1, int len)
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
sizeof对指针的话,结果是相应的类型:
char* ss = "";
sizeof(ss)
结果是4 => ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4. sizeof(*ss) 结果 1, => *ss是第一个字符,其实就是获得了字符串的第一位“0” 所占的内存空间,是char类型的,占了1个字节,strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen.
本文地址:,欢迎访问原出处。
不打个分吗?
转载随意,但请带上本文地址:
如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 。
大家都在看
阅读一百本计算机著作吧,少年
福勒(Martin Fowler) (作者), 熊节 (译者)
《重构:改善既有代码的设计》清晰地揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了70多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。《重构:改善既有代码的设计》提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险。
扫一扫,在手机上阅读
栏目最新博文
18,561 views
19,217 views
14,948 views
9,781 views
13,986 views
15,132 views
10,136 views
10,545 views
12,477 views
17,647 views
栏目博文推荐
13,073 views
5,862 views
7,040 views
6,427 views
4,534 views
8,016 views
17,228 views
18,561 views
5,592 views
8,752 views
正因为难,所以才超凡脱俗。
1,179 views
关于网站与作者
互联网信息太多太杂,各互联网公司不断推送娱乐花边新闻,SNS,微博不断转移我们的注意力。但是,我们的时间和精力却是有限的。这里是互联网浩瀚的海洋中的一座宁静与美丽的小岛,供开发者歇息与静心潜心修炼(愿景)。
“Veda”的本义是知识、启示,希望这里能为开发者提供充足的技术资料。
我的电子邮件gonnsai(,腾讯微博:,欢迎与我联系。君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
c语言的sizeof函数
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口C语言中的sizeof的用法详解
C语言中的sizeof的用法详解
一、sizeof的概念
  sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。
二、sizeof的使用方法
  1、用于数据类型
  sizeof使用形式:sizeof(type)
  数据类型必须用括号括住。如sizeof(int)。
  2、用于变量
  sizeof使用形式:sizeof(var_name)或sizeof var_name
  变量名可以不用括号括住。如sizeof (var_name),sizeof
var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。
  注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char
char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。
3、指针与静态数组的sizeof操作
指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。
注意:int *p; sizeof(p)=4;
&&&&&&&&&&&&&&&&&
但sizeof(*p)相当于sizeof(int);&&&&&
对于静态数组,sizeof可直接计算数组大小;
&&& 例:int
a[10];char b[]="hello";
&&&&&&&&&&&
&&sizeof(a)等于4*10=40;
&&&&&&&&&&&&&
sizeof(b)等于6;
注意:数组做型参时,数组名称当作指针使用!!
&&&&&&&&&&&&&&
void& fun(char p[])
&&&&&&&&&&&&&&
{sizeof(p)等于4}&&&
经典问题:
double* (*a)[3][6];
cout&&sizeof(a)&&
// 4 a为指针
cout&&sizeof(*a)&&
// 72 *a为一个有3*6个指针元素的数组
cout&&sizeof(**a)&&
// 24 **a为数组一维的6个指针
cout&&sizeof(***a)&&
// 4 ***a为一维的第一个指针
cout&&sizeof(****a)&&
// 8 ****a为一个double变量
问题解析: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。
sizeof使用场合。
4、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: 
  void *malloc(size_t size), 
  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
5、用它可以看看一类型的对象在内存中所占的单元字节。
void * memset(void * s,int c,sizeof(s))
6、在动态分配一对象时,可以让系统知道要分配多少内存。
7、便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。
8、由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。
9、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
三、sizeof的结果
  sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned
int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
1、若操作数具有类型char、unsigned char或signed char,其结果等于1。
  ANSI C正式规定字符类型为1字节。
2、int、unsigned int 、short int、unsigned short 、long int 、unsigned
long 、float、double、long double类型的sizeof 在ANSI
C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。相关常数: sizeof
int:4,sizeof short:2,sizeof long:4,sizeof float:4,sizeof
double:8,sizeof char:1,sizeof p:4,sizeof WORD:2,sizeof DWORD:4
3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft
C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。
4、当操作数具有数组类型时,其结果是数组的总字节数。
5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
  让我们看如下结构:
  struct {}
  在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。
  这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。
6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
7、应用的例子
char* ss = "";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[] = "";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[100] = "";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100&1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
int ss[100] = "";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100&4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''\0''结尾的
char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3
第二个例子:class X
cout&&sizeof(X)&&
结果 12 ===》内存补齐
cout&&sizeof(x)&&
结果 12 同上
第三个例子:char szPath[MAX_PATH]
  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void
fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
四、sizeof与其他操作符的关系
一)sizeof与strlen的区别
 sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。
1.与strlen()比较
strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。
而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。
2.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
3.sizeof是算符,strlen是函数。
4.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如:
short f();
printf("%d\n", sizeof(f()));
输出的结果是sizeof(short),即2。
5.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
6.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
7.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
8.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
9.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺
寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
10.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如: fun(char [8])
fun(char [])
都等价于 fun(char *)
在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小,
需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int
& unsigned char* buf = new unsigned
char[len+1]
& memcpy(buf, p1, len);
11.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data
alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS
VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma
pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced
compiler页中的Data alignment为按字节对齐。
12.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式
 五、sizeof的主要用途
  1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:
  void *malloc(size_t size),
  size_t fread(void * ptr,size_t size,size_t nmemb,FILE *
  2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:
  void * memset(void * s,int c,sizeof(s))。
  由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用ziseof来代替常量计算。sizeof()功能:计算数据空间的字节数
1.因为对齐问题使结构体的sizeof变得比较复杂,看下面的例子:(默认对齐方式下)
cout&&sizeof(s1)&&
cout&&sizeof(s2)&&
&&同样是两个char类型,一个int类型,一个double类型,但是因为对齐问题,导致他们的大小不同。计算结构体大小可以采用元素摆放法,我举例子说明一下:首先,CPU判断结构体的对界,根据上一节的结论,s1和s2的对界都取最大的元素类型,也就是double类型的对界8。然后开始摆放每个元素。
&对于s1,首先把a放到8的对界,假定是0,此时下一个空闲的地址是1,但是下一个元素d是double类型,要放到8的对界上,离1最接近的地址是8了,所以d被放在了8,此时下一个空闲地址变成了16,下一个元素c的对界是4,16可以满足,所以c放在了16,此时下一个空闲地址变成了20,下一个元素d需要对界1,也正好落在对界上,所以d放在了20,结构体在地址21处结束。由于s1的大小需要是8的倍数,所以21-23的空间被保留,s1的大小变成了24。
&对于s2,首先把a放到8的对界,假定是0,此时下一个空闲地址是1,下一个元素的对界也是1,所以b摆放在1,下一个空闲地址变成了2;下一个元素c的对界是4,所以取离2最近的地址4摆放c,下一个空闲地址变成了8,下一个元素d的对界是8,所以d摆放在8,所有元素摆放完毕,结构体在15处结束,占用总空间为16,正好是8的倍数。
&这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小,看下面的例子:
char a[8];
cout&&sizeof(s1)&&
cout&&sizeof(s2)&&
cout&&sizeof(s3)&&
cout&&sizeof(s4)&&
&s1和s2大小虽然都是8,但是s1的对齐方式是1,s2是8(double),所以在s3和s4中才有这样的差异。
&&&所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。
2.不要让double干扰你的位域
  在结构体和类中,可以使用位域来规定某个成员所能占用的空间,所以使用位域能在一定程度上节省结构体占用的空间。不过考虑下面的代码:
 int i: 8;
 int j: 4;
 int a:3;
 int i: 8;
 int j: 4;
 int a:3;
cout&&sizeof(s1)&&
cout&&sizeof(s2)&&
cout&&sizeof(s3)&&
cout&&sizeof(s4)&&
  可以看到,有double存在会干涉到位域(sizeof的算法参考上一节),所以使用位域的的时候,最好把float类型和double类型放在程序的开始或者最后。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。柠檬奶茶 的BLOG
用户名:柠檬奶茶
文章数:27
评论数:28
访问量:71280
注册日期:
阅读量:5863
阅读量:12276
阅读量:363958
阅读量:1059383
[匿名]51cto游客:
[匿名]Khan.Lau:
[匿名]gg:
51CTO推荐博文
只要参加软件研发的笔试(C/C++)几乎都会涉及到sizeof()的用法,我昨天也遇到了,有的也会,但是真正sizeof()的核心还是没有领会,今天上网,无聊中就看到了详细的sizeof()的阐述,现在分享给大家。
------------sizeof----------------
sizeof 一般形式为:sizeof(object),也可以sizeof var_char,不过大部分programer习惯用sizeof()。
&&&& 对象可以是表达式或者数据类型名,当对象是表达式时,括号可省略。sizeof是单目运算符,其运算符的含义是:求出对象在计算机内存中所占用的字节数。一般来讲,不同的机器,运行不同的对象是不一样的,当目前几乎所有的机器都是32位,很少16位的,所以一般考试都是基于32位的window和linux的。
C语言中数据类型不多。
1.整数型的:
short,int,long(我没有考虑符号问题),一般c语言书上讲,int是2个字节的,即16位,范围是-3,long是4个字节,范围是-2^32---2^32-1。当时在xp上运行sizeof(int)的时候,会output 4.这就是32位的原因。sizeof(long)也是4.
如下:#include "stdio.h"#include "string.h"#include "stdlib.h"int main(){&short int sa=10;&& &int a=10;&& &long la=10;&& &float f = 20;&& &double d=20;&& &char ch='c';&& &char str[]="ABC";&& &char *p=&& &struct str{&&&&&&&}str_&struct str1{&&&&&&&}str_wu1;&& &printf("sizeof(short):%d\n",sizeof(sa));&printf("sizeof(int):%d\n",sizeof(a));&& &printf("sizeof(long):%d\n",sizeof(la));&& &printf("sizeof(float):%d\n",sizeof(f));&& &printf("sizeof(double):%d\n",sizeof(d));&& &printf("sizeof(char):%d\n",sizeof(ch));&& &printf("sizeof(string):%d\n",sizeof(str));&& &printf("sizeof(point address):%d\n",sizeof(p));&& &printf("sizeof(Point):%d\n",sizeof(*p));&& &printf("sizeof(Struct):%d\n",sizeof(str_wu));&& &printf("sizeof(Struct):%d\n",sizeof(str_wu1));&& &system("pause");}
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
alt="" src="/attachment/908046.jpg" border="0" />
因而int,short的sizeof结果是一样的额。
2.浮点型数据
float,double,long double
上边的图,long double 没有测试(忘了。。。。。)呵呵!
但是应该是16。
对于指针,要特别区分,指针指向什么数据,它在内存占的字节数才是它的结果。
比如:指针指向一个字符串,就是字符串的长度,因为一个字符在内存中占一个字节。若指针指向一个数据结构,则结果应该是结构型数据的内存字节数。
4。结构类型
在上面的程序中,
struct str{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&}str_&struct str1{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}str_wu1;两个不同的结构,但是内部的元素是相同的,都是double,int,char,只是顺序不一样,就结果不一样。why?
这时因为VC存储数据的时候要对其,具体的情况如下:
类型  对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
  Char  偏移量必须为sizeof(char)即1的倍数
  int   偏移量必须为sizeof(int)即4的倍数
  float  偏移量必须为sizeof(float)即4的倍数
  double  偏移量必须为sizeof(double)即8的倍数
  Short  偏移量必须为sizeof(short)即2的倍数
比如:str_wu,为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整个结构的大小为:sizeof(str_wu)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。
而str_wu1,同样的道理:如下:sizeof(char)=1,而1不是8的倍数,因而增加到8,sizeof(double)=8,现在开始地址是16,16是sizeof(int)的倍数,可以存入。
因而总的地址数:sizeof(char)+7+sizeof(double)+sizeof(int)=20,
而20不是8的倍数(sizeof(double)=8),所以需要在增加4个地址,即总共24。
----------------------
sizeof具体的,我所知道的就这些了,那位高手还知道什么,或者我写的有什么错,希望指出。谢谢!
&本文出自 “” 博客,谢绝转载!
了这篇文章
附件下载:  
类别:未分类┆阅读(0)┆评论(0)
09:45:52 16:06:17 16:52:04 21:06:34 11:36:49 &&1&
&&页数 ( 1/3 ) &
请输入验证码:c语言详解sizeof_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
c语言详解sizeof
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 安卓图形密码忘记 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信