嵌入式C语言(二)
我们终此一生,就是为了摆脱他人的期待,找到真正的自己。
一、存储类型
1、内存分配方式
(1)栈区间分配
在定义变量时操作系统会根据定义的数据类型给变量再栈区分配空间。
(2)堆区动态内存分配和回收
#include <stdlib.h>
int *Malloc(int *p){
int *p = (int *)malloc(sizeof(int));//在堆区申请空间
if(P == NULL){//检测空间申请是否成功
puts("malloc error");
return -1;
}
return p;
}
使用malloc分配的内存空间是在堆区的,堆区的内存操作系统不会负责回收,需要程序员自己记得不使用的时候要回收资源,否则就会造成内存泄漏。
void Free(int **p){
free(*p);//手动释放空间
*p = NULL;//指针置空,防止野指针
return;
}
2、存储类型
二、枚举
#include<stdio.h>
enum student{
s1, //默认为0
s2, //顺序加1,为1
s3 = 10, //10
s4 //顺序加1,为11
}stu_1,stu_2;
int main(){
stu_1 = s1;
stu_2 = s4;
printf("stu_1 = %d, stu_2 = %d", stu_1, stu_2);// 0 11
return 0;
}
三、结构体
#inlude <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 30
//定义结构体类型时一般都是定义在全局处方便其他函数使用
//拆分文件时一般定义结构体都写在.h文件中
typedef struct student{
int id;
char name[32];
int score;
}stu_t;
typedef struct class_t{
stu_t person[N];//结构体中可以包含结构体变量
int count;
}class_t;
int main(){
/*your code*/
return 0;
}
1、结构体对齐
(1)32位系统
小于4字节按最大成员对齐,大于等于4字节按4字节对齐。
(2)64位系统
按最大成员对齐。
2、结构体位域
#include <stdio.h>
//是为了压缩空间
struct LED{
unsigned char led1:1;//此处是使用 :1 指定成员只占用1个bit位
unsigned char led2:1;
unsigned char led3:1;
unsigned char led4:1;
unsigned char led5:1;
unsigned char led6:1;
unsigned char led7:1;
unsigned char led8:1;
};
int main(int argc, const char *argv[])
{
printf("sizeof(struct LED) = %ld\n", sizeof(struct LED));//1字节
struct LED my_led;
my_led.led1 = 0;
my_led.led2 = 1;
return 0;
}
四、共用体
共用体成员公用空间,修改一个成员都会改变。
#include <stdio.h>
#include <string.h>
typedef union Test{
char a;
short b;
int c;
}test_t;
int main(int argc, const char *argv[])
{
printf("sizeof(hqyj) = %ld\n", sizeof(test_t));//4
union Test v2;
memset(&v2, 0, sizeof(v2));//给v2的4个字节都赋值成 0
printf("&v2.a = %p &v2.b = %p &v2.c = %p\n", &v2.a, &v2.b, &v2.c);//一样的
v2.a = 100; //修改 v2 的 a成员的值为100
//其他成员的值也会发生变化 因为用的是同一块内存空间
printf("v2.a = %d v2.b = %d v2.c = %d\n", v2.a, v2.b, v2.c);//100
return 0;
}
五、分文件编程
将程序分为:主程序、源程序、头文件三个部分,主程序中写main函数和调用函数,源程序中写被调用函数,头文件中写构造结构体以及被调用函数的声明。