2004-4-21 16:29
beginjx
<!--emo&:(--><img src='style_emoticons/default/sad.gif' border='0' style='vertical-align:middle' alt='sad.gif' /><!--endemo--> <br />能否举个例子,我是个初学者,不会使用sizeof<br />多谢
2004-4-21 16:34
thrips
sizeof(var) 返回var的长度 常常用来进行变量的初始化,<br />如<br /> memset(&var,0x00,sizeof(var));<br />或 <br />type var;<br /> memset(&var, 0x00, sizeof( type));
2004-4-21 16:40
beginjx
还有简单的例子啊?
2004-4-21 16:50
thrips
我倒,还不简单阿
2004-4-21 17:11
carol
<!--QuoteBegin-thrips+2004-04-21 16:50:39--><div class='quotetop'>QUOTE(thrips @ 2004-04-21 16:50:39)</div><div class='quotemain'><!--QuoteEBegin--> 我倒,还不简单阿 <!--QuoteEnd--></div><!--QuoteEEnd--><br /><!--emo&:veryhappy:--><img src='style_emoticons/default/bighappy.gif' border='0' style='vertical-align:middle' alt='bighappy.gif' /><!--endemo--><br /><br /><!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin--><b><span style='font-size:14pt;line-height:100%'>解析C语言中的sizeof </span></b><br /><br /><br /><a href='http://www.ccidnet.com' target='_blank'>http://www.ccidnet.com</a> 作者:方敏、吴鸣鸣 (2001-04-19 14:43:36) <br />一、sizeof的概念 <br /> sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 <br /><br />二、sizeof的使用方法 <br /> 1、用于数据类型 <br /><br /> sizeof使用形式:sizeof(type) <br /><br /> 数据类型必须用括号括住。如sizeof(int)。 <br /><br /> 2、用于变量 <br /><br /> sizeof使用形式:sizeof(var_name)或sizeof var_name <br /><br /> 变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。 <br /><br /> 注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 <br /><br /> 如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。 <br /><br />三、sizeof的结果 <br /> sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 <br /><br /> 1、若操作数具有类型char、unsigned char或signed char,其结果等于1。 <br /><br /> ANSI C正式规定字符类型为1字节。 <br /><br /> 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。 <br /><br /> 3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。 <br /><br /> 4、当操作数具有数组类型时,其结果是数组的总字节数。 <br /><br /> 5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。 <br /><br /> 让我们看如下结构: <br /><br /> struct {char b; double x;} a; <br /><br /> 在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。 <br /><br /> 这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。 <br /><br /> 6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。 <br /><br />四、sizeof与其他操作符的关系 <br /> sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。 <br /><br />五、sizeof的主要用途 <br /> 1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: <br /><br /> void *malloc(size_t size), <br /><br /> size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。 <br /><br /> 2、sizeof的另一个的主要用途是计算数组中元素的个数。例如: <br /><br /> void * memset(void * s,int c,sizeof(s))。 <br /><br />六、建议 <br /> 由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用ziseof来代替常量计算。 <br /> <!--QuoteEnd--></div><!--QuoteEEnd-->
2004-4-21 17:17
carol
干脆弄弄明白 <!--emo&:wub:--><img src='style_emoticons/default/wub.gif' border='0' style='vertical-align:middle' alt='wub.gif' /><!--endemo--> <br /><br /><!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin--><span style='font-size:14pt;line-height:100%'><b>深入理解sizeof</b></span><br /> <br />[ 作者:房秉毅 转贴自:不详 点击数:274 更新时间:2004-3-20 文章录入:潇寒 ] <br /> <br />一、好首先看看sizeof和strlen在MSDN上的定义:<br /><br />首先看一MSDN上如何对sizeof进行定义的:<br />sizeof Operator<br /><br />sizeof expression<br /><br />The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type <br />(including aggregate types). This keyword returns a value of type size_t.<br /><br />The expression is either an identifier or a type-cast expression (a type specifier enclosed in <br />parentheses).<br /><br />When applied to a structure type or variable, sizeof returns the actual size, which may include <br />padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof <br />returns the size of the entire array. The sizeof operator cannot return the size of dynamically <br />allocated arrays or external arrays.<br />然后再看一下对strlen是如何定义的: <br /><br />strlen<br /><br />Get the length of a string.<br /><br />Routine Required Header:<br />strlen <string.h><br /><br />size_t strlen( const char *string );<br />Parameter<br />string:Null-terminated string <br />Libraries<br />All versions of the C run-time libraries.<br /><br />Return Value<br />Each of these functions returns the number of characters in string, excluding the terminal <br />NULL. No return value is reserved to indicate an error.<br /><br />Remarks<br />Each of these functions returns the number of characters in string, not including the <br />terminating null character. wcslen is a wide-character version of strlen; the argument of <br />wcslen is a wide-character string. wcslen and strlen behave identically otherwise.<br /><br />二、由几个例子说开去。<br /><br />第一个例子: <br />char* ss = "0123456789";<br />sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针<br />sizeof(*ss) 结果 1 ===》*ss是第一个字符<br /><br />char ss[] = "0123456789";<br />sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1<br />sizeof(*ss) 结果 1 ===》*ss是第一个字符<br /><br />char ss[100] = "0123456789";<br />sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1<br />strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前<br /><br />int ss[100] = "0123456789";<br />sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4<br />strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''\0''结尾的<br /><br />char q[]="abc";<br />char p[]="a\n";<br />sizeof(q),sizeof(p),strlen(q),strlen(p);<br />结果是 4 3 3 2 <br />第二个例子:<br />class X<br />{<br />int i;<br />int j;<br />char k;<br />};<br />X x;<br />cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐<br />cout<<sizeof(x)<<endl; 结果 12 同上<br /><br />第三个例子:<br />char szPath[MAX_PATH]<br /><br /> 如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小) <br /><br />三、sizeof深入理解。 <br />1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 <br />2.sizeof是算符,strlen是函数。 <br />3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如: <br />short f();<br />printf("%d\n", sizeof(f()));<br /><br />输出的结果是sizeof(short),即2。 <br />4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。 <br />5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 <br />char str[20]="0123456789";<br />int a=strlen(str); //a=10;<br />int b=sizeof(str); //而b=20;<br /><br />6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。 <br />7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。 <br />8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺 寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 <br />9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如: <br />fun(char [8])<br />fun(char [])<br /><br />都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去 <br />fun(unsiged char *p1, int len)<br />{<br /> unsigned char* buf = new unsigned char[len+1]<br /> memcpy(buf, p1, len);<br />}<br /><br />有关内容见: C++ PRIMER? <br />10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。 <br />11.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式 <br />四、结束语<br /><br />sizeof使用场合。 <br />1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: <br /> void *malloc(size_t size), <br /> size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。<br /><br />2.用它可以看看一类型的对象在内存中所占的单元字节。 <br />void * memset(void * s,int c,sizeof(s))<br /><br />3.在动态分配一对象时,可以让系统知道要分配多少内存。 <br />4.便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。 <br />5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。 <br />6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。 <br /> <br /><!--QuoteEnd--></div><!--QuoteEEnd-->
2004-4-21 19:15
无双
carol那里也贴出了很多<!--emo&:rose:--><img src='style_emoticons/default/rose.gif' border='0' style='vertical-align:middle' alt='rose.gif' /><!--endemo--> <br /><br />sizeof是运算符 当编译器编译时 会自动运算这个变晨的大小的 并使用它的大小代替sizeof的值<br /><br />如<br />int len = sizeof(int);<br />编译时 编译器计算出int的大小 大小为4 所以把上面这句变成<br />int len = 4
2004-4-22 08:03
thrips
服啦!<br />一个sizeof也能贴这么多!!!
2004-4-22 08:41
carol
<!--QuoteBegin-thrips+2004-04-22 08:03:58--><div class='quotetop'>QUOTE(thrips @ 2004-04-22 08:03:58)</div><div class='quotemain'><!--QuoteEBegin--> 服啦!<br />一个sizeof也能贴这么多!!! <!--QuoteEnd--></div><!--QuoteEEnd--><br />呵呵,偶本来想写一个比你的例子还简单的例子,结果一不小心写成了 strlen 的例子,所以觉得还是贴人家写的比较保险 <!--emo&:redface:--><img src='style_emoticons/default/icon_redface.gif' border='0' style='vertical-align:middle' alt='icon_redface.gif' /><!--endemo-->
2004-4-22 12:54
无双
贴自己的也不错啊 最少是自己的理解<!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo-->
2004-4-22 21:35
carol
偶用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度<br />看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:<br /><br />char str[20]="0123456789";<br />int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。<br />int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。 <!--emo&:unsure:--><img src='style_emoticons/default/unsure.gif' border='0' style='vertical-align:middle' alt='unsure.gif' /><!--endemo--> 偶这样理解对吧<br /><br />上面是对静态数组处理的结果,如果是对指针,结果就不一样了<br /><br />char* ss = "0123456789";<br />sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4<br />sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位<br /><br />strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
2004-4-22 21:51
无双
nt a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。<br />int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。<br /><br /><br />偶觉得这样的理解事实上很正确啊<!--emo&:rose:--><img src='style_emoticons/default/rose.gif' border='0' style='vertical-align:middle' alt='rose.gif' /><!--endemo--> 而且又简单<br /><br />所以carol要是直接放上来就好了<!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo--><br /><br />strlen计算的是字符串的长度<br /><br />sizeof计算的是变量使用的内存大小 <br /><br />指针只是使用int来保存 所以是4个字节
2004-4-22 21:59
carol
呵呵~~~ <!--emo&:D--><img src='style_emoticons/default/laugh.gif' border='0' style='vertical-align:middle' alt='laugh.gif' /><!--endemo--> 实践的多了,偶越来越觉得以前学的不扎实,心虚呐<br /><br />以后要静下心来看文章,好好学技术 <!--emo&:P--><img src='style_emoticons/default/tongue.gif' border='0' style='vertical-align:middle' alt='tongue.gif' /><!--endemo--><br /><br />有什么理解的不对的,请无双多多纠正 <!--emo&:blush:--><img src='style_emoticons/default/blush.gif' border='0' style='vertical-align:middle' alt='blush.gif' /><!--endemo-->
2004-4-23 08:25
无双
<!--emo&:awkard:--><img src='style_emoticons/default/awkard.gif' border='0' style='vertical-align:middle' alt='awkard.gif' /><!--endemo--> <br /><br />偶觉得carol的水平也不错的 勇敢一点 自信一点就好了
2004-4-23 12:26
beginjx
<!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo--> <br />多谢各位大师指点,感激万分.
2005-8-10 17:24
coon
非常不错,学到了不少东西,而且开拓了思路:)
2005-8-12 09:31
irror
<!--emo&:cry:--><img src='style_emoticons/default/cry_smile.gif' border='0' style='vertical-align:middle' alt='cry_smile.gif' /><!--endemo--> <!--emo&:cry:--><img src='style_emoticons/default/cry_smile.gif' border='0' style='vertical-align:middle' alt='cry_smile.gif' /><!--endemo--> =====>感动!! <!--emo&:rose:--><img src='style_emoticons/default/rose.gif' border='0' style='vertical-align:middle' alt='rose.gif' /><!--endemo--> <!--emo&:rose:--><img src='style_emoticons/default/rose.gif' border='0' style='vertical-align:middle' alt='rose.gif' /><!--endemo-->
2006-6-22 13:23
Tristing
别讨论了,郁闷死了!
页:
[1]
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.