C++中sizeof操作符与strlen函数

  • sizeof操作符:

sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数。返回值一个常量表达式,类型为size_t。

size_t sizeof(type)

size_t sizeof expr

在sizeof的运算对象中解引用一个无效指针仍然是一种安全的行为,因为指针实际上并没有被真正使用,sizeof并不需要真的解引用指针也能知道它所指对象的类型。

sizeof对C++的所有内置类型求其所占空间的大小:

环境:win7 64-bits, Code::Blocks 16.01, GUN GCC Compiler with C++11 ISO Standard


Type


Number of bytes


bool


1


char


1


wchar_t


2


char16_t


2


char32_t


4


short


2


int


4


long


4


long long


8


float


4


double


8


long double


12


std::string


4

1. sizeof对数组

传入数组头指针,返回每个元素所占的字节数乘以数组的长度。

2. sizeof对C风格字符串

传入头指针,返回的是字符串长度加上末尾结束符’\0’的总长度。

C风格字符串有两种,一种是指针形式:const char* s = “hello”; 将s传入给sizeof,会认为s为一个指针,返回的是指针所占的字节数。

另一种是数组形式:const char c_str[] = “hello”; 将头指针c_str传给sizeof,是按数组形式的计算所占字节数,返回的是字符串长度加上末尾结束符的总长度。

3. sizeof对指针

传入任意类型的指针,返回值由计算机内存地址总线的宽度决定,32-bits的操作系统返回4,64-bits的操作系统返回8。

4. sizeof对结构体(类)

空的结构体(没有任何成员),返回1,表示仅含占位符;对含有多个数据成员的结构体,所有成员所占的内存字节要与所占内存最长的成员进行对齐,不足的进行内存补齐,例如结构体内最长的成员为double,占8个字节,另一成员为char,原本占1个字节,因此char类型的成员需进行内存与double类型对其,在1字节后补齐7个字节,形成8个字节,因此整个结构体所占的总字节数即为最长的成员字节数乘以数据成员数;另外,不考虑函数成员所占的内存,函数成员会储存在代码区,而不是栈区,所以不考虑。

5. sizeof对联合体(union)

union在内存中储存是层叠式的,各成员共享一段内存,因此返回的是所占字节数最长的成员的字节数。例如最长的成员为double,其它无论还有多少个成员且任意小于double的类型,返回的值均为8。

6. sizeof对函数

sizeof对函数操作实际上是求其返回值类型所占的字节数。求值时必须完整地写出函数调用的形式,但并不实际调用函数。

示例程序:

//测试C++中的sizeof()
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

size_t getPtrSize(char* cptr)
{
    return sizeof(cptr);
}

struct NoMember
{

};
struct S_int_char
{
    char c;
    int i;
};
struct S_int_short
{
    short s; //sizeof(short) == 2
    int i;
};
struct S_int_func
{
    int i;
    double ret_i() //不考虑
    {
        return i;
    }
};
struct S_ONLY_func
{
    double func()
    {
        return 0;
    }
};

//联合体
union my_u
{
    int a;
    float b;
    double c;
    char d;
};  

//函数
short func_short()
{
    return 0;
}
float func_float(int a, int b)
{
    return 1.1;
}

int main()
{
    //C风格字符串的测试
    char c_str[] = "Hello!";
    cout << sizeof(char) << " " << sizeof(c_str) <<  " " << getPtrSize(c_str) << endl;

    //数组测试
    double d_arr[20];
    cout << sizeof(d_arr) << endl; //返回值为80,4*10 == 80 

    //指针的测试
    char* p;
    cout << sizeof(p) << endl; //返回值是4,由计算机内存地址总线的宽度决定
                               //与所指对象无关 

    //结构体的sizeof测试
    NoMember nm;
    cout << sizeof(nm) << endl;
    S_int_char sic;
    cout << sizeof(sic) << endl; //int是4,char是1,
                                 //为了c与i的空间对齐,对c往后相邻的3个内存加入填充字节
                                 //是空间对齐,则总的空间为i的4加上c的4,得到8
    S_int_short sis;
    cout << sizeof(sis) << endl; //同样需要内存对齐,返回的也是8
    S_int_func sif;
    cout << sizeof(sif) << endl; //返回值为4,不考虑成员函数所占的空间
    S_ONLY_func sof;
    cout << sizeof(sof) << endl; //返回值为1,不考虑成员函数所占的空间 

    //联合体的测试
    my_u u;
    cout << sizeof(u) << endl; //返回值为最大的成员所占空间长度,最大为double,返回8 

    //函数的测试
    cout << sizeof(func_short()) << endl;
    cout << sizeof(func_float(1, 2)) << endl;

    return 0;
}
  • strlen函数:

strlen函数定义在头文件cstring.h中,用于计算字符串的长度,但空字符’\0’不计算在内。参数为C风格字符串的头指针,返回值是字符串的长度,空字符不计算在内。计算原理是顺着头指针向后找,直到遇到空字符才停下来。注意,如果字符数组没有以空字符结尾,调用strlen()函数可能产生重大错误,因为会不断向前找直到遇到空字符。例如:

char ca[] = {‘a’, ‘b’, ‘c’}; //不以空字符结束
cout << strlen(ca) << endl; //严重错误

示例程序:

#include <iostream>
#include <cstring>
int main()
{
    //腾讯实习软开 2016-04-03
    const char* s = "hello tencent.\0";
    const char c_str[] = "hello tencent.\0";
    cout << sizeof(s) << " " << strlen(s) << " " << sizeof(c_str) << endl;
    return 0;
}

测试输出:

时间: 2024-11-10 14:05:38

C++中sizeof操作符与strlen函数的相关文章

字符串 前篇 ---- sizeof()操作符和strlen()库函数

本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖.希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法).我们只做 实用意义 的介绍和讨论. 在介绍字符串之前,先介绍 sizeof()操作符 . strlen()库函数. 1.sizeof() 基本介绍 1 printf("int: %d\n", sizeof(int)); 2 printf("char: %d\n", sizeof(char)); 3 printf(&

sizeof运算符、strlen()函数和转义字符

本篇文章posted on 2019-12-23 12:58 本人之前写过一篇类似的文章(链接:sizeof运算符和strlen()函数),也比较深入,但是和本篇相比,本篇更加深入. 首先请看下面的代码,这个代码应该输出什么. 下面是C语言代码. 1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a=2,b=0; 6 sizeof(b=a++); 7 printf("a=%d,b=%d\n",a,b); 8 return 0;

浅析C++中sizeof操作符的用法

1. 概要 sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数.返回值类型为size_t,在头文件stddef.h中定义. 这是一个依赖于编译系统的值,一般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规范,都会保证char.signed char和unsigned char的sizeof值为1,毕竟char是编程能用的最小数据类型. MSDN上的解释为: The sizeof keyword giv

C++ sizeof操作符的用法和strlen函数的区别

摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和strlen的区别: sizeof的用法: sizeof 是一种单目操作符,而不是函数.sizeof以字节形式给出操作数的存储空间. 操作数可以是一个表达式或在括号内的类型名.操作数的存储空间由操作数的类型决定. char str[]="hello"; char str1[100]; ch

strcpy,strlen, strcat, strcmp函数,strlen函数和sizeof的区别

//计算字符串实际长度        //strlen()函数:当遇到'\0'时,计算结束,'\0'不计入长度之内,如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止//    char string[] = "I Love You!";//    unsigned long len = strlen(string);//    printf("len = %lu\n", len);  //11//    //    stri

CC++中sizeof函数的用法

C/C++中sizeof()函数的用法 学习C/C++有时会遇到下面的情况: 已知 char *str1="absde"; char str2[]="absde"; char str3[8]={'a'}; char str4 [] = "0123456789"; 为什么sizeof(str1)=4 sizeof(str2)=6; sizeof(str3)=8; sizeof(str4)=11;呢? 丈二和尚摸不着头脑,接下来我们一起好好讨论讨论,

sizeof和strlen函数区别

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

C++(C)中Sizeof与Strlen的区别

C++(C)中Sizeof与Strlen的区别 一.知识总结: 1.sizeof (1).使用方法 sizeof为运算符 sizeof unary-expression sizeof ( type-name ) (2).运行阶段 sizeof在编译时计算. (3).返回值 sizeof:获取对象所分配的字节大小. 用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系. 具体而言,当参数分别如下时,sizeof返回的值表示的含义如下: 数组

程序猿之---C语言细节26(C语言中布尔类型、continue细节、sizeof举例、strlen举例)

主要内容:C语言中布尔类型.continue细节.sizeof举例.strlen举例 一.布尔类型 可能很多人不知道现在C语言已经有了布尔类型:从C99标准开始,类型名字为"_Bool" 在C99标准之前我们常常自己模仿定义布尔类型,常见有以下几种方式: 1.方式一 #define TURE 1 #define FALSE 0 2.方式二 typedef enum {false, true} bool; 3.方式三 typedef int bool 闲int浪费内存,对内存敏感的程序使