c语言——枚举,联合体,动态内存分配

枚举的定义

枚举也是数据类型

enum Week {
MON,TUES,WED,THURS,ERI,SAT,SUN
};
enum Week day = MON;
printf("%d", day);

上述代码中,day为枚举类型的变量

 使用define定义的标识符常量进行的是整体替换,如下

联合体(公用体) 

联合体也是一种特殊的自定义类型,这种类型定义的变量也包含一系列成员,特点是这些成员公用一块空间(所以联合体又叫共用体)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>;
//定义一个联合体
union MyUnion {
	char a;
	int b;
	float c;
};
int main() {
	//定义一个联合体类型的变量
	union MyUnion u;
	//求该联合体变量的大小
	printf("%d
",sizeof(u));
	//对该联合体变量的每个成员进行初始化
	u.a = 65;
	u.b = 110;
	u.c = 1.65;
	//求每个成员的地址
	printf("%p
", &u.a);
	printf("%p
", &u.b);
	printf("%p
", &u.c);
	return 0;
}

 

有上述代码,联合体变量的大小与联合体中成员中大小最大的数据类型所占空间大小相等

联合体变量中的成员公用一块空间,故其地址相等

运行结果为81

动态内存分配

内存分配中有栈区和堆区,局部变量在栈区,全局变量在堆区

内存分配中常见的区域:

为什么存在动态内存分配

动态分配内存函数的介绍 

 malloc函数 

calloc函数 

int main() {
// 向内存申请10个整型类型的空间
int* p = (int*)calloc(10, sizeof(int));
//判断是否开辟成功
if (p == NULL) {
// 打印错误信息
printf("%s
", strerror(errno));
}
else {
//给10个空间进行赋值并打印
int i = 0;
for (int i = 0; i < 10; i++) {
*(p + i) = i + 1;
}
// 打印
for (int i = 0; i < 10; i++) {
printf("%-4d", *(p + i));
}
// 使用空间
free(p);
p = NULL;
}
return 1;
}

realloc函数

realloc函数的出现让动态内存管理更加灵活

有时,我们会发现以前申请的空间太大或者太小,为了合理使用内存,要对内存大小进行灵活调整,realloc函数可以完成此任务

int main() {
// 向内存申请5个整型类型的空间
int* p = (int*)calloc(5, sizeof(int));
//判断是否开辟成功
if (p == NULL) {
// 打印错误信息
printf("%s
", strerror(errno));
}
else {
//给5个空间进行赋值并打印
int i = 0;
for (int i = 0; i < 5; i++) {
*(p + i) = i + 1;
}
// 在这里20个字节的空间不能满足要求,需要进行调整
int* np = (int*)realloc(p, 40);
for (int i = 5; i < 10; i++) {
*(np + i) = i + 10;
}
//打印
for (int i = 0; i < 10; i++) {
printf("%-4d", *(np + i));
}
// 释放空间
free(np);
np=NULL;
}
return 1;