sizeof 和 strlen

1. sizeof

1.1 sizeof是一个独立的运算符,不是函数。sizeof给我们提供有关数据项目所分配的内存的大小。例如:


1

2

cout << sizeof(long) << endl;   // 输出: 4

cout << sizeof(double) << endl; // 输出:8

1.2 如果将sizeof应用于一个类型,必须要像上面所示那样使用括号。但如果对一个变量使用它,可以不用括号。


1

2

int x;

cout << sizeof x << endl;       // 输出: 4

1.3 char类型表示单个字符,只占一个字节的内存空间,所以sizeof(char)=sizeof(‘a’)=1 。另外,相关数据项目为空,所以sizeof(‘’)不为零,而是报错。但是,“”为一个C风格的字符串,末尾会被自动加上结束符‘\n’,所以有sizeof(“”)=1,sizeof(“\0”)=2。


1

2

3

4

5

6

char c = ‘c‘;

cout << sizeof(char) << endl;   // 输出:1

cout << sizeof(c) << endl;      // 输出:1

//cout << sizeof(‘‘) << endl;   // 编译时错误:不能为空字符常量

cout << sizeof("") << endl;     // 输出:1

cout << sizeof("\0") << endl;   // 输出:2

1.4 str1是一个指针,只是指向了字符串"hello"而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节。*str与str[0]一样,都表示字符串中的第一个字符‘h’,所以sizeof(*str1)=1。*(str1+1)表示第二个字符,依次类推。


1

2

3

4

const char* str1 = "hello";

cout << sizeof(str1) << endl;   // 输出:4

cout << sizeof(char*) << endl;  // 输出:4

cout << sizeof(*str1) << endl;  // 输出:1

1.5 str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串"hello" 占的总空间。"hello"中,共有h e l l o \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6 。


1

2

char str2[]="hello";

cout << sizeof(str2) << endl;   // 输出:6

1.6 str3已经定义成了长度是8的数组,所以sizeof(str3)=8*sizeof(char)=8 。


1

2

char str3[8]={‘h‘,};

cout << sizeof(str3) << endl;   // 输出:8

1.7 如果给出的数据项目不是字符型数组,而是一种自定义类型对像数组,那么sizeof(str3)=8*sizeof(对像类型或对像)。如:


1

2

3

4

5

6

7

8

class A

{

    int x;

    double d;

};

A a[10];

cout << sizeof(A) << endl;      // 输出:16,此处有内存补齐,所以不是12

cout << sizeof(a) << endl;      // 输出:160

1.8 大部分编译程序在编译的时候就把sizeof计算过了,这就是sizeof(x)可以用来定义数组长度的原因。下面数组a2的长度是根据a1的长度来定的。


1

2

3

4

int a1[10];

cout << sizeof(a1)/sizeof(int) << endl;     // 输出:10

int a2[sizeof(a1)/sizeof(int)];

cout << sizeof(a2)/sizeof(int) << endl;     // 输出:10

1.9 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸,特别是当sizeof应用于虚参形式的数组时,得到的结果是4(指针大小) 。应牢记住数组在作为参数传递时,永远都是传递数组的地址。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

#define MAXSIZE 100

// 此处等同于 void PrintSize(char* str)

void PrintSize(char str[MAXSIZE])

{

    cout << sizeof(str) << endl;        // 输出:4

}

int main()

{

    char str1[MAXSIZE];

    cout << sizeof(str1) << endl;       // 输出:100

    PrintSize(str1);

}

2.0 sizeof还可以应用于函数,注意函数fun只声明未定义:


1

2

3

4

5

6

7

double fun();

int main()

{

    cout << sizeof(fun()) << endl;      // 输出:8

    //cout << sizeof(fun) << endl;      // 编译时出错:非法的sizeof操作数

}

2.1 sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等


1

2

//cout << sizeof(void) << endl;     // 编译时出错:非法的sizeof操作数

cout << sizeof(void*) << endl;      // 输出:4,就是指针的存储空间

总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清。sizeof可应用于任何内置类型和自定义类型。

2. strlen

2.1 strlen是函数,它不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把/0计入字符串的长度的。使用时需要包函头文件string.h。


1

2

3

4

5

6

7

char str4[] = "hello";

cout << strlen(str4) << endl;   // 输出: 5

const char *str5 = "hello";

cout << strlen(str5) << endl;   // 输出:5

cout << strlen("") << endl;     // 输出:0

cout << strlen("\0") << endl;   // 输出:0

2.2 strlen只能用于C类型字符串,注意必须是字符串且以‘\0’结尾,用于其它任何类型都是错误的。


1

2

3

4

5

6

7

8

9

10

11

12

13

//cout << strlen(int) << endl;  // 出错:不能用于类型

//cout << strlen(‘‘) << endl;   // 出错:不能用于字符

//cout << strlen(‘a‘) << endl;  // 出错:不能用于字符

char str6[5] = {‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘};

//cout << strlen(str6) << endl; // 运行时出错:str6不是一个"C风格字符串",即不是以‘\0‘

                                    // 结尾的字符串,此处输出一个不确定值,本例为19

class B

{

    int x;

    double d;

};

B b[10];

//cout << strlen(b) << endl;    // 出错:一句话,只能用于字符串,还必须是“C风格的”

2.3 strlen的结果要在运行的时候才能计算出来。

时间: 2024-10-19 05:30:10

sizeof 和 strlen的相关文章

C++Sizeof与Strlen的区别与联系

一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.实际上,用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系.    具体而言,当参数分别如下时,sizeof返回的值表示

C语言中的sizeof和strlen

1.sizeof是算符,strlen是函数: 2.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的: 3.大部分编译程序,在编译的时候就把sizeof计算过了,这是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因: 4.strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,不是类型占内存的大小: 5.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧,这是因为sizeof是个操作符不是个函数. 示例代码:

C语言:内存地址分析 &amp; sizeof和strlen用法总结

还是在大学时代接触的C语言,当时学习数组.指针等概念时,怎一个"晕"字了得.最近在学习之余,疯狂地恶补了相关知识,故总结之,如有错误,请大家多多指点. 一. 内存地址分析 1) 先来看一个最基础的例子: int a[4]; 提问:&a[0],  a,  &a,  a+1,  &(a+1),  &a+1 分别表示什么? 咋一看,真的不知所措: 我们可以图解来分析它(假设下面的操作均在32为系统上面). 先来对上图进行简单的说明工作: 1. 紫色区域就是数组

sizeof与strlen的区别

本文列举了sizeof与strlen的区别,总结一下: sizeof()的结果是一个对象占用的字节数,对于字符串包括字符串结尾的\0. strlen()的结果不包括\0. 下面是源码: #include <stdio.h> int main() { int i = 0; char acNum[] = "12345"; ; char ac3Num[3] = "12"; char *pcNum = "12345" //printf(&qu

sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正是帮助大家将相关知识总结清楚. 正文 先看一段代码 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void testchar(char str[]) 5 { 6 printf("%d %d\n", sizeof(str

sizeof和strlen的区别

char str[20]="0123456789"; int   a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记. int   b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响 char *str1="absde"; char str2[]="absde";char str3[8]={'a',};char

【转】Sizeof与Strlen的区别与联系

一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.实际上,用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系.    具体而言,当参数分别如下时,sizeof返回的值表示

sizeof和strlen

Sizeof与Strlen的区别与联系 一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.实际上,用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系.    具体而言,当

sizeof 和strlen

当计算字符串的大小时,sizeof和strlen的区别: sizeof 包括字符结束标识符,strlen不包括. #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int a[2] = {0,1}; char b[7] = "hellor"; int i = sizeof(a); int j = sizeof(a)/sizeof(a[0]); int m =

C语言-Sizeof与Strlen的区别与联系(转)

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的