在标准C和C++中,长度为0的数组是被禁止使用的。不过有些编译器(如GCC)的扩展功能支持 0 长度的数组,但是这个功能是不可移植的,所以,如果你致力于编写可移植,或者是稍稍需要跨平台的代码,需要注意。但它只能被用于结构体的最后一个成员。
#include <stdio.h>
#include <stdlib.h>
struct line {
int length;
char contents[0];
};
int main(void)
{
int i, count = 9;
char letter = 'A';
struct line *thisline = (struct line *)malloc(sizeof(struct line) + count);
thisline->length = count;
for (i = 0; i < count; i++)
thisline->contents[i] = letter++;
printf("sizeof(struct line) = %d\n", sizeof(struct line));
for (i = 0; i < thisline->length; i++)
printf("%c ", thisline->contents[i]);
printf("\n");
return 0;
}
例子输出结果:
[cpp] view plaincopy
sizeof(struct line) = 4
A B C D E F G H I
2、变长数组
在支持变长数组之前,C语言数组的大小是在声明时确定的(下标是一个常量表达式)并一直保持不变。所谓变长数组就是指数组的大小可以在运行时指定。注意,变长num一定要声明在变长数组arr之前。
----------------------------------------我是分割线--------------------------------------
一、__attribute__
1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的。
二、union(共用声明和共用一变量定义)“联合”是一种特殊的类,也是一种构造类型的数据结构。这些数据共享同一段内存,以达到节省空间的目的 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。
三、(还有一个节省空间的类型:位域)。