【C++】sizeof和strlen的区别,尤其注意sizeof在结构体中的内存对齐问题

1、sizeof 与 strlen 的区别与使用详解。这算是 C++ 中基础中的基础了,很容易被考到。
2、首先,两者最大的区别就是:sizeof是一个单目运算符,而strlen是一个函数
3、strlen 是一个函数,只能以 char* (字符串或者字符串数组)作为参数,用来计算指定字符串 str 的长度,需要注意的是,该函数计算的是字符串到‘\0’的长度(不包括’\0’)

1)首先,‘\0’ 是一个特殊的字符常量,代表空字符(Null Character)。它的ASCII码值为0。对于字符串来说,它是以 null-terminated 的方式表示的,即字符串末尾会添加一个’\0’字符作为结束标志。例如:char str[] = “Hello”; 在内存中,该字符数组实际存储为:H, e, l, l, o, \0
2)如果这个字符数组是这种形式:char str[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’},那么他肯定没有’\0’作为结束标志,使用strlen会返回随机值。

4、sizeof 是一个单目运算符,它的参数可以是数组、指针、字符串、对象等等,计算的是参数所对应内存空间的实际字节数。

5、以下代码可以详细理解:

#include <bits/stdc++.h> 
using namespace std;
int main() {
    char* s1 = "0123456789";
    // 输出 8,因为这时的参数 s 是一个指向字符串常量的字符指针,因此计算的是指针的大小,
    // 注意这里不同编译器得到的值可能不同,也有可能是4(一般64位系统为8,32位系统为4)
    cout<<sizeof(s1)<<endl;  
    cout<<sizeof(*s1)<<endl;  // 输出 1,*s 是第一个字符(char类型的字节数为1)
    cout<<strlen(s1)<<endl;  // 输出 10,有10个字符,strlen是个函数,内部实现是用一个循环计算到\0之前为止
    //strlen(*s1);  // 报错,因为strlen函数的参数类型只能是 char* 即字符串
    
    char s2[] = "0123456789";  // 动态数组
    // 结果为11,数组名虽然本质上是一个指针,但是作为sizeof的参数时,计算的是整个数组的大小,
    // 这点要特别注意。且在求动态数组的大小时,sizeof统计到第一个结束字符'\0'处结束
    cout<<sizeof(s2)<<endl;  
    cout<<strlen(s2)<<endl;  // 结果为10
    cout<<sizeof(*s2)<<endl;  // 结果为1,*s是第一个字符
    
    char s3[100] = "0123456789";
    cout<<sizeof(s3)<<endl;  // 结果为100,因为内存给数组 s3分配了字节数为100的空间大小
    cout<<strlen(s3)<<endl;  // 结果为10
    
    int s4[100] = {0,1,2,3,4,5,6,7,8,9};
    cout<<sizeof(s4)<<endl;  // 结果为400,因为int数组中每个元素都是int型,int型占用4字节
    //strlen(s4);  // 报错,strlen不能以int* 作为函数参数
    
    char p[] = {'a', 'b','c','d','e', 'f', 'g','h'};
    char q[] = {'a', 'b','c','d','\0', 'e', 'f', 'g'};
    cout<<sizeof(p)<<endl;  // 结果为8
    cout<<strlen(p)<<endl;  // 结果是一个随机数,因为字符串数组中没有结束字符 '\0', 因此该函数会一直统计下去,直到碰到内存中的结束字符
    cout<<sizeof(q)<<endl;  // 结果还是8
    cout<<strlen(q)<<endl;  // 结果为4, 结束字符 '\0'前有4个字符
    return 0;
}

6、sizeof在统计结构体的大小时还有一个内存对齐的问题,具体如下:

struct Stu {
    int i;
    int j;
    char k;
};

Stu stu;
cout<<sizeof(stu)<<endl;  // 输出 12:i和j都是占用4字节,char占用1字节,由于结构体内存通常为4的倍数,因此9变为12,实现内存对齐
  • 注意:结构体的内存对齐可能会浪费一些内存,但理论上速度快了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值