C++/C中常见小问题总结

sizeof问题

函数参数传递数组的退化问题

注意sizeof是一个运算符,而不是一个函数。所以一般情况下数组传递给函数,都是要退化成指针的。所以下面这个

void fun(char str_arg[100])
{
    printf("%d\n", sizeof(str_arg));
}

输出4(32位)或者8(64位);作为函数参数传递,以下写法均等价:

fun(char [8])
fun(char [])
fun(char *) 

###sizeof和strlen的区别###

    char a[] = "1234";
    char b[10] = "12345";
    cout << sizeof(a) << " " << strlen(a) << endl;
    //输出5 4
    cout << sizeof(b) << " " << strlen(b) << endl;
    //输出10 5

因为strlen只能传入char* ,它是从头开始找直到找到’\0’为止,其只返回数组自己的长度,而sizeof计算的是开辟这块内存空间的大小。

类对象的sizeof大小

有两个需要注意的地方,一个是虚函数的虚函数表占4字节,还有一个是对其问题对齐问题,在我的另外一个文章中已经说过了C++11中枚举enum和union,顺带说一下内存对齐和大小端问题

还有个小细节

柔性数组
struct A{
};
cout<<sizeof(A);   //输出1,虽然类里面没有任何东西,但是它还是会占个地方(?)这个地方解释存疑

struct B{
    int t;
    int a[0];
};
cout<<sizeof(B);    //输出4   

长度为0的数组,这样只能在结构体/类中定义,如果再函数中定义会报错,其不占内存空间。这种数组叫柔性数组

结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申请和释放)而如果使用数组,那么只需要一次就可以全部分配出来,(见下面的例子),反过来,释放时也是一样,使用数组,一次释放,使用指针,得先释放结构体内的指针,再释放结构体。还不能颠倒次序。
其实就是分配一段连续的的内存,减少内存的碎片化。


函数传指针问题再探

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值