strlen 与 sizeof

gluckm 2006-10-11 11:13:08
初学c++ ,请高人指点下

char buff[100] = "\0" ;
char *p = buff ;
cout << sizeof(buff) << endl ;
cout << sizeof(p) << endl ;
cout << strlen(buff) << endl ;

在vc6.0下得出的结果

输出为:100 4 0

问题:1.为什么sizeof(p)求得是4? 是不是p这个指针的长度?
2.sizeof与strlen是用什么来判断数组的长度的?是不是\0?
如果可以的话,能不能麻烦说一下sizeof与strlen是如何实现的?
谢谢...
...全文
119 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gluckm 2006-10-11
  • 打赏
  • 举报
回复
taodm(taodm) 太谢谢了
我还不知道后面有 索引表 呢
gluckm 2006-10-11
  • 打赏
  • 举报
回复
adintr(www.adintr.com)(其实,我不是一个演员)
sizeof 数据类型所占的字节数,编译器判断 ??
如何判断?
taodm 2006-10-11
  • 打赏
  • 举报
回复
呃,去找本C++ Primer来学C++。它后面有索引表,你去里面找一下sizeof,就什么都知道了。
以后有什么问题也记得先去翻索引表。可以节省你很多时间的。
westdot 2006-10-11
  • 打赏
  • 举报
回复
一、好首先看看sizeof和strlen在MSDN上的定义:

首先看一MSDN上如何对sizeof进行定义的:

sizeof Operator

sizeof expression

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.

The expression is either an identifier or a type-cast expression (a type
specifier enclosed in parentheses).

When applied to a structure type or variable, sizeof returns the actual size,
which may include padding bytes inserted for alignment. When applied to a
statically dimensioned array, sizeof returns the size of the entire array.
The sizeof operator cannot return the size of dynamically allocated arrays or
external arrays.

然后再看一下对strlen是如何定义的:

strlen

Get the length of a string.

Routine Required Header:
strlen <string.h>

size_t strlen( const char *string );
Parameter
string:Null-terminated string
Libraries
All versions of the C run-time libraries.

Return Value
Each of these functions returns the number of characters in string, excluding
the terminal NULL. No return value is reserved to indicate an error.

Remarks
Each of these functions returns the number of characters in string, not
including the terminating null character. wcslen is a wide-character version
of strlen; the argument of wcslen is a wide-character string. wcslen and
strlen behave identically otherwise.

二、由几个例子说开去。

第一个例子:

char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符

char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符

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

int ss[100] = "0123456789";
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 2

第二个例子:

class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
cout<<sizeof(x)<<endl; 结果 12 同上

第三个例子:

char szPath[MAX_PATH]

  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚
参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)

三、sizeof深入理解。

* 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
* 2.sizeof是算符,strlen是函数。
* 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以'\0'结尾的。
sizeof还可以用函数做参数,比如:

short f();
printf("%d\n", sizeof(f()));

输出的结果是sizeof(short),即2。
* 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
* 5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就
是sizeof(x)可以用来定义数组维数的原因

char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

* 6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类
型占内存的大小。
* 7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof
是个操作符不是个函数。
* 8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态
地空间数组, sizeof 归还全部数组的尺 寸。 sizeof 操作符不能返回动态地被分派了
的数组或外部的数组的尺寸
* 9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:

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);
}

有关内容见: C++ PRIMER?
* 10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同
CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经
常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)
。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应
用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得
到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储
,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data
alignment为按字节对齐。
* 11.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 * stream)

* 2.用它可以看看一类型的对象在内存中所占的单元字节。

void * memset(void * s,int c,sizeof(s))

* 3.在动态分配一对象时,可以让系统知道要分配多少内存。
* 4.便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来
放该类型的字节大小。
* 5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用
sizeof来代替常量计算。
* 6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
adintr 2006-10-11
  • 打赏
  • 举报
回复
strlen 字符串长度,用 '\0' 判断
sizeof 数据类型所占的字节数,编译器判断
cuiweibing 2006-10-11
  • 打赏
  • 举报
回复
学习
adintr 2006-10-11
  • 打赏
  • 举报
回复
gluckm() ( ) 信誉:100 Blog
adintr(www.adintr.com)(其实,我不是一个演员)
sizeof 数据类型所占的字节数,编译器判断 ??
如何判断?
---------------------------------------------------------
在一种确定的平台和编译器上,各种数据类型的大小是确定的,这个编译器自己是非常清楚的。
比如 某种32位系统上, int 是 4, 指针是 4, double 是 8, char 是 1, char [10] 是 10
, int [10] 是 40 等等,都是编译器在编译器推算出来的。
而 strlen 是运行的时候扫描内存来决定的
gluckm 2006-10-11
  • 打赏
  • 举报
回复
谢谢大家的帮助

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧