C++/C语言sizeof关键字详解

目录

 

sizeof关键字

主要功能

常见用法

与基本数据类型的相关的内存空间大小的求解

与数组相关的内存空间大小的求解

在数组的定义处

在具体函数的中

运行实例

与指针的相关的变量所占内存空间大小的求解

运行实例

与结构体相关的变量所占内存空间大小的求解 

运行实例

与枚举相关的变量所占内存空间大小的求解  

运行实例

与联合体(union)相关的变量所占内存空间大小的求解  

运行实例


  • sizeof关键字

sizeof  为C语言的一个主要关键字,而并非是一个函数,虽然其后经常会跟着一对括号,这就导致许多人认为这是一个函数,进而产生误解。

  •  主要功能

求某一特定的变量、指针、结构体、枚举、联合体等所占内存空间的大小。

  •  常见用法

  •  与基本数据类型的相关的内存空间大小的求解

sizeof(short) = ?
sizeof(int) = ?
sizeof(float) = ?
sizeof(double) = ?
sizeof(char) = ?

这些基本数类sizeof所求的内存空间大小受到不同系统的约束。例如:在64位系统下,其大小分别为:

sizeof(char)   = 1
sizeof(short)  = 2
sizeof(int)    = 4
sizeof(float)  = 4
sizeof(double) = 8

 

  •  与数组相关的内存空间大小的求解

int   arr[64] = {0};

sizeof(arr) = ?
sizeof(arr[0]) = ?
sizeof(arr[64]) = ?
sizeof(&arr) = ?
sizeof(&arr[0]) = ?


int  func (int arr[])
{
    sizeof(arr) = ?
    sizeof(&arr) = ?
}

  • 在数组的定义处

  1. sizeof(arr) = 256, 是求数组的实际大小,即为 64 * 4 = 256
  2. sizeof(arr[0]) = 4 ,是求数组的第一个元素所占内存空间的大小,即和其定义时候的数据类型有关,这里为int 即为4字节,若为char即为1个字节依次类推。
  3. sizeof(arr[64]) = 4,与sizeof(arr[0])类似;
  4. sizeof(&arr),则是求&arr所占内存空间的大小,即求一个指针所占内存空间的大小,会与系统是64位还是32位有关;若为64位系统,则其大小位8字节,若为32位系统,则其大小位4字节 。
  5. sizeof(&arr[0])与sizeof(&arr)类似,都是求解一个指针所占内存空间的大小;
  • 在具体函数的中

  1. sizeof(arr) = 8,因为在函数传参的时候数组实参会当指针形参来处理,即所传的只是数组的首地址,所以sizeof(arr)的大小会与系统的位数有关;
  2. 其他的sizeof的相关求解不发生变化,例如sizeof(&arr) = 8;
  • 运行实例

    ***********in arr:**********
    
    sizeof(arr)      = 256
    sizeof(&arr)     = 8
    sizeof(&arr[0])  = 8
    sizeof(arr[64])  = 4
    sizeof(arr[0])   = 4
    
    
    *********in function:**************
    
    sizeof(arr)      = 8
    sizeof(&arr[0])  = 8
    

     

  •  与指针的相关的变量所占内存空间大小的求解

int  p_int = NULL;

sizeof(p_int) = ?

sizeof(*p_int) = ?
  1. sizeof(p_int)  只要是指针其用sizeof来求某个指针变量所占内存空间的大小都与系统的位数有关,若为64位,则其大小永远位8字节;若为32位,则其大小永远为4字节。
  2. sizeof(*p_int) = 4,指针前加*表示取指针所指向的那段内存存放的值,即*p_int为int类型,所以其大小为4字节;
  • 运行实例

    sizeof(p_int)  = 8
    sizeof(*p_int) = 4

     

  • 与结构体相关的变量所占内存空间大小的求解 

typedef struct student
{
    char          name[64];
    int           age;
    unsigned int  id;
    char          sex;
                 
}student_t;  


typedef struct zero
{
    char          name[64];
    int           age;
    unsigned int  id;
    char          sex;
                 
}zero_t;  


void test()
{
    student_t st_student;
    printf("sizeof(st_student)   = %ld\n", sizeof(st_student));
    zero_t st_aero;
    printf("sizeof(st_zero)   = %ld\n", sizeof(st_zero));
    
}
  1. sizeof(st_student)的大小为多少呢? 是73?还是76?答案显然不是73。因为结果体会有字节对齐。正确答案为76
  2. 结构体对齐的概念:即以结构体成员中占内存最多的数据类型所占的字节数为标准,所有的成员在分配内存时都要与这个长度对齐。我们以上面这个程序为例,结构体变量 student 的成员中占内存最多的数据类型是 int 型,其占 4 字节的内存空间,那么所有成员在分配内存时都要与 4 字节的长度对齐。也就是说,虽然 char 只占 1 字节,但是为了与 4 字节的长度对齐,它后面的 3 字节都会空着。所以其大小都会4的整数倍。
  3. 如果我们定义一个空的结构体。那么其大小会是多少呢? 0? 1? 还是其他?我们会理所当然认为他的值应该是0,但是很可惜他不是0,而是1。但是我在Ubuntu的gcc的编译器下测试结果为0,在vc下测试结果为1,也许他还会和编译的实现相关吧。还有些编译器如果你定义一个空的结构体他会不干,抛错。
  4. #pragma pack(x)我们也可以是#pragma pack(x)来改变结构体对齐的字节。例如:
    #pragma pack (1)
    
    typedef struct student
    {                                                
        char          name[64];                      
        int           age;                           
        unsigned int  id;                            
        char          sex;                           
                                                     
    }student_t;     
    
    void test()
    {
        student_t st_student;
        printf("sizeof(st_student)   = %ld\n", sizeof(st_student));
    }
  5. 其输出值为 : 
    sizeof(st_student)   = 73

     

  • 运行实例

sizeof(st_student)   = 76

sizeof(st_zero)      = 0

 

  • 与枚举相关的变量所占内存空间大小的求解  

enum color                                     
{                                              
    RED,                                       
    BLUE,                                      
    YELLOW                                     
}en_color;                                     
          

void test()                                    
{                                              
    printf("sizeof(en_color)   = %ld\n", sizeof(en_color));
}  
  1. sizeof(en_color)  ==> sizeof(int),永远为4,不管其内部有多少变量。枚举类型,指一个被命名的整型常数的集合。即枚举类型,本质上是一组常数的集合体,只是这些常数有各自的命名。枚举类型,是一种用户自定义数据类型。枚举变量,由枚举类型定义的变量。枚举变量的大小,即枚举类型所占内存的大小。由于枚举变量的赋值,一次只能存放枚举结构中的某个常数。所以枚举变量的大小,实质是常数所占内存空间的大小(常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节),枚举类型所占内存大小也是这样。
  • 运行实例

    sizeof(en_color)   = 4

     

  • 与联合体(union)相关的变量所占内存空间大小的求解  

    union 
    {
        int  age;
        char name[64];
        char sex;
         
    }un_student;
    
    void test()
    {    
        printf("sizeof(un_student)   = %ld\n", sizeof(un_student));
    } 

     

  1. sizeof(un_student) = 64,因为联合体的大小为其中定义的最大变量的大小。
  • 运行实例

    sizeof(un_student)   = 64

     

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
C语言中,sizeof是一个操作符,用来获取一个数据类型或变量的字节大小。它返回的结果是一个size_t类型的值,表示字节数。引用提到了一些关于C语言sizeof的特殊情况,针对32位机而言,下面是几个例子: 1. 如果我们定义了一个结构体struct test,其中包含了8个int类型的成员变量a、b、c、d、e、f、g和h。那么使用sizeof(test)获取到的结果是32,因为每个int类型占据4个字节,所以8个int类型的成员变量总计占据32个字节。 2. 如果我们创建了一个test类型的引用r,指向一个test类型的对象。那么使用sizeof(r)获取到的结果也是32,因为引用r所指向的对象是test类型,而sizeof一个引用得到的结果是sizeof一个被引用的对象的大小,即sizeof(test)的结果。 3. 如果我们尝试使用sizeof获取一个数组的大小,比如数组arrayA,那么编译会出错,因为在C语言中,sizeof不能获取数组的大小,而是返回数组元素类型的大小。 综上所述,在C语言中,sizeof是用来获取数据类型或变量的字节大小的操作符。它返回的结果是一个size_t类型的值,表示字节数。在一些特殊情况下,sizeof的行为可能会有所不同,比如结构体和引用的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ sizeof 实例解析](https://download.csdn.net/download/weixin_38569515/12814125)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C/C++ | sizeof()函数](https://blog.csdn.net/weixin_47187147/article/details/123470258)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C/C++sizeof 详解](https://blog.csdn.net/HellowWorld001/article/details/119303406)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiaoCheng'Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值