1.代码
#include<stdio.h>
#define A(a) printf("%d\n",a);
#define ARR(x,n) for(int i =0;i<n;i++)\
printf("%d ",x[i]);\
printf("\n");
#define STRUCT(x)\
printf("%c\n%d\n%f\n%d\n",x.c,x.i,x.d,x.s);
int a;
int arr[3];
struct MyStruct
{
char c;
int i;
double d;
short s;
};
struct MyStruct stu;
int main() {
int a2;
int arr2[3];
struct MyStruct stu2;
printf("a:\n");
A(a);
//A(a2); //局部变量使用报错.初始化为0xCCCC CCCC
printf("arr:\n");
ARR(arr, 3);
//ARR(arr2, 3); //局部变量使用报错.初始化为0xCCCC CCCC
printf("MyStruct:\n");
STRUCT(stu);
//STRUCT(stu2); //局部变量使用报错。按类型初始化
//NULL在ASCII码中无表示。int型数值为0.
A(stu.c);
printf("MyStruct Size:\n");
A(sizeof(stu.c)); A(sizeof(stu.i)); A(sizeof(stu.d)); A(sizeof(stu.s));
A(sizeof(stu)); //Struct结构体按字节对齐存储
//下面采用局部变量进行赋值。
printf("MyStruct assignment:\n");
stu2 = stu;
STRUCT(stu2);
stu2 = (struct MyStruct){65,10,0.12342,15};
STRUCT(stu2);
//下面采用局部变量进行初始化。
printf("MyStruct Initialize:\n");
struct MyStruct stu3 = {65,10,0.12342,15};
STRUCT(stu3);
struct MyStruct stu4 = { .c = 65 }; //加;报错
STRUCT(stu4);
struct MyStruct stu5 = { .d = 0.12342 };
STRUCT(stu5);
return 0;
}
2.输出
a:
0
arr:
0 0 0
MyStruct:
0
0.000000
0
0
MyStruct Size:
1
4
8
2
24
MyStruct assignment:
0
0.000000
0
A
10
0.123420
15
MyStruct Initialize:
A
10
0.123420
15
A
0
0.000000
0
0
0.123420
0
3.解释
1)全局变量,按类型初始化为0.(结构体中的变量亦然)
2)结构体在内存中按字节对齐存贮。
第一个8字节:
char | 空 | 空 | 空 | int | int | int | int |
第二个8字节存double。
第三个8字节:
short | short | 空 | 空 | 空 | 空 | 空 | 空 |