#include <stdio.h>
#include <stdlib.h>
#include <string.h>/* 包含了使用字符串函数的所需的原型和声明,便于程序执行错误检查 */
#include <math.h>
typedef struct
{ int len;
int len1;
char data[0];//不占用内存空间,会在后面连续的分配一块内存空间使用,和指针区别开来
}SS1;
typedef struct
{ int len;
int len1;
int data[1];//占用内存空间,会在后面连续的分配一块内存空间使用,和指针区别开来
}SS2;
typedef struct
{ int len;
int len1;
char *data;//不占用内存空间,会在后面连续的分配一块内存空间使用,和指针区别开来
}SS3;
typedef struct
{ char len;
int len1;
char data;
}W0;
typedef struct
{ char len;
char len1;
int data;
}W1;
typedef struct
{ int len;
char len1;
short data;
double data1;
int len2;
}W2;
//#pragma pack(2)
/*结构体数据类型的对齐规则如下(常见陷阱)
1.数据类型自身的对齐值:
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
3.指定对齐值:#pragma pack (value)时的指定对齐值value。
4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。
*/
#pragma pack(2)/* 设置2字节对齐 */
typedef struct
{
char len1;
long int data1;
int len2;
}W3,*b;
#pragma pack() /* 取消指定对齐,恢复缺省对齐(4字节对齐) */
typedef enum
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday //尾部不能有逗号
}weekday;
void testarr(int *m);
void teststatic();
void Show(short n);
void testarr(int *m)
{
printf("arr name m1 = %d\n", sizeof(m));
}
void teststatic()
{
static int n=10;
printf("n = %d\n", n);
n++;
}
void Show(short n) {
short i;
printf("%d(",n);
for(i = 0; i < 16; ++i)
printf("%d",(n & (1 << (15 - i))) >> (15 - i));
printf(")B\n");
}
int main(int argc, char **argv)
{
#if 0
/*1.C语言的输入和输出函数的用法*/
printf("--------------------------1------------------------------\n");
int a[10] = {0};
//a++;
printf("a=%d\n",a[0]);
//printf("a=%d\n",a);
//printf("a=%d\n",&a);
int b = 0;
scanf("%d",&b);
printf("%d\n",b);
/*2.利用结构体定义变长数组和指针的对比*/
printf("--------------------------2------------------------------\n");
typedef struct
{ int len;
int data[0];
}SS;
SS sa;//结构体相关的局部变量初始化,不初始化后面的数据是一个随机值
//SS sa={0};
memset(&sa,0,sizeof(SS));//清空以上结构体中的随机值
printf("sizeof(SS)=%d\n",sizeof(SS));
printf("len=%d\n",sa.len);
printf("data=%d\n",sa.data[0]);
sa.len = 10;
sa.data[0] = 80;
sa.data[10] = 80;
sa.data[20] = 80;
sa.data[50] = 80;
sa.data[60] = 80;
sa.data[65] = 80;
sa.data[66] = 80;//到了67就不行了
printf("len = %d\n",sa.len);
printf("data0 = %d\n",sa.data[0]);
printf("data10 = %d\n",sa.data[10]);
printf("data20 = %d\n",sa.data[20]);
printf("data50 = %d\n",sa.data[50]);
printf("data60 = %d\n",sa.data[60]);
printf("data60 = %d\n",sa.data[65]);
printf("data60 = %d\n",sa.data[66]);
printf("sizeof(SS) = %d\n",sizeof(SS));
printf("sizeof(sa)