c语言结构体数组如何判空,C/C++中空结构体、空数组、空类的作用

1、sizeof是什么?

对象类型的大小是在编译的时候直接确定的。

sizeof不是一个函数,而是一个返回对象类型大小的宏。

其作用是返回一个对象或类型所占的内存字节数。

如下例子可以运行通过:

int main()

{

int a = 12;

int b[sizeof(a)];

cout << sizeof(b)/sizeof(int) << endl;

return 0;

}

在栈上定义数组只能是常量或者常量表达式,不能含有变量;

在堆上定义数组可以含有变量。

int i = 10;

//在栈上定义

int nums1[10];

int nums2[10 + 2];

//在堆上定义

int* nums3 = new int[i];

2、一个对象的大小

一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的。

对象的大小 = vptr(指向虚函数表的指针)+ 所有非静态数据成员的大小 + Aligin字节大小(字节对齐)

3、为什么sizeof一个空类的结果为1?

类在实例化的过程中,都会获得一个独一无二的内存地址,为了达到这个目的,编译器往往会给空类隐含的增加一个字节(char),这样空类在实例化后的内存中得到了独一无二的地址。

4、为什么使用空类?

空类在“泛型编程”中,空类(空结构)的用处非常广:

我们利用类型(通常是空类),来区别对待不同类对象的属性。

通过使用函数重载的方法,在参数中加入一个空类来作为区分不同的函数的方法,编译的时候直接选择,而不是在运行的时候选择,是非常提高效率的。

5、空数组

空数组在结构体中不占空间,空数组名是一个指针(但是不占空间),它指向一个位置:

在结构体中,指针指向前面一个成员结束后的第一个空间;

在非结构体中,指针指向的内容,与前一个对象的指针的内容一样。

如下例子,输出为8,即c这个空数组不占空间。

struct Test

{

int a;

char b;

char c[0];

};

int main()

{

cout << sizeof(Test) << endl; //输出为8

return 0;

}

6、类中的空数组

此时输出为1.

struct T

{

char c[0];

};

int main()

{

cout << sizeof(T) << endl; //输出为1

return 0;

}

7、为什么使用空数组?

问题:如果要给一个结构体添加一个缓冲区,要怎么做?

定义一个固定长度的buffer数组成员。但是这样buffer的大小会被锁死。

定义一个buffer指针,在构造函数中动态的创建一个需要大小的buffer。但是这样我们需要特别的管理这个空间,否则容易出现内存泄露,且一个buffer指针还占有了一个空间。

使用空数组来解决这个问题:

此时sizeof(T)的值为8,buffer[0]不占空间。而在申请空间的时候,加上buffer_len(缓冲区的长度),这样结构体和缓冲区就一起被申请了。这样的好处是结束的时候,可以调用free一起释放结构体和缓冲区,避免独立的管理结构体和缓冲区。

sttuct  T

{

int a;

int b;

char buffer[0];

};

struct T* p=(T*)malloc(sizeof(T) +buffer_len);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值