宏
用一个字符串代替一个数据
1.为了让一些数据更有意义。(一般都是默认k开头)
#define kout -1
2。简洁代码,类似于内敛函数的意思,使用简便。
#define kadd(a,b) ((a)+(b))----参数和整体都要加括号,不然会有歧义 涉及优先级问题
3.调试开关,输出日志的开关.
#if 0
#define Debug(X) printf("%s\n")
#else
#define Debug(x)
#endif
枚举enum
typedef enum{
....
}kAnimalCategory;
宏定义与enum区别
宏定义是一个值或表达式,不是类型,仅仅是给一个表达式取个别名。枚举是一个类型,可以定义枚举类型的一个变量。
自动分配内存--当定义以基本类型的变量的时候,系统会为这个变量自动分配内存,这个内存在堆上,当作用域结束,系统会将这个内存回收。
动态分配内存----开发人员自己像系统申请的内存空间,申请的内存位于栈上,当作用域结束之后,系统是不会自动回收内存,是由开发人员自己去释放,如果不释放,就内存泄露了。
1.什么时候需要动态分配内存?----程序运行过程中,需要保存、记录相应的数据,但是有没有提前准备好内存,那么就需要临时动态内存的分配。
void malloc(size_t);-------size_t 希望申请的内存空间(单位byte)
void 系统一开始不知道你要存的数据类型,不同的数据需要的内存空间不同,所以默认就是void*类型,泛指所有指针类型(char *,int*,struct*),使用时自动转化为需要的类型,如果分配空间失败,返回null。
首次分配内存必须用malloc
释放内存free(void*)
注意--free里面的参数必须是指针,这个指针指向的内存必须是动态分配的。
计算结构体内存空间
原理--如果结构体内有多中数据类型,那么以占据内存字节数最高的类型对齐。
typedef struct{
char *name;
int age;
}Person;----16
char *8字节,int 4字节 所以age 变量自动像name对齐,整个占据16字节.
typedef struct{
char name;
int age;
}Person;----8
typedef struct{
char name[6];
int age;
}Person;----12