前言
本章主要学习的是动态内存分配
student *p = &s
我们知道指针变量是用来保存内存地址的。那我们能不能把指针和结构体结合到一起玩玩?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdio.h> #include <string.h>
typedef struct { char stuid[20]; char stuName[20]; int age; }student;
int main() { student stu; student *p = &stu; strcpy(p->stuid,"20230101"); strcpy(p->stuName,"张三"); p->age=20; printf("student id=%s\n",stu.stuid); printf("student name=%s\n",stu.stuName); printf("student age=%d\n",stu.age); printf("------------------------------\n"); return 0; }
|
其实这一段代码理解起来不难,但是看到我们输出的部分,我需要知道我们是否正常的通过指针成功修改了我们的结构体内的值。
1 2 3 4 5 6 7 8 9 10
| ------------------------------
student id=20230101
student name=张三
student age=20
-------------------------------
|
虽然成功的修改成功了,但是有点没太大意义看起来。所以我准备在加入一点小料,来点函数看看能不能体会到这个的真正含义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <stdio.h> #include <string.h>
typedef struct { char stuid[20]; char stuName[20]; int age; }student;
void init(student *p) { strcpy(p->stuid,"20230101"); strcpy(p->stuName,"张三"); p->age=20; }
int main() { student stu; init(&stu); printf("------------------------------\n"); printf("student id=%s\n",stu.stuid); printf("student name=%s\n",stu.stuName); printf("student age=%d\n",stu.age); printf("------------------------------\n"); return 0; }
|
现在我做了一个初始化的一个函数。 但是我有一个问题,为什么我不直接传入一个结构体进去?
我们传入一个结构体进去,实际上只是复制了一份过去而已,并没有通过函数中做一些操作,然后改变原本的这个结构体变量。
内存分类
在通过 C 程序编译后,会以三种方式使用内存
静态/全局内存
- 静态声明的变量和全局变量使用这部分内存,这些变量在程序开始运行时分配,知道程序终才消失。
自动内存(栈内存)
- 函数内部声明的变量使用这部分内存,在函数被调用时才创建
动态内存(堆内存)
- 根据需求编写代码动态分配内存,可以编写代码来释放这个空间,内存中的内容直到释放才消失。
动态内存分配
基本步骤
- 使用 malloc(memroy allocate)函数来分配内存
我们这里的这个 size_t 时这样用的。如果我们想在堆内存当中来开辟一片空间来使用的话,我们得确定我们需要开辟一个多大的内存空间来使用。如果成功,会返回堆内存上分配的内存指针。如果失败的话,就会返回一个空指针。
- 使用分配的内存
- 使用 free 函数释放内存
1 2 3 4 5 6 7 8 9 10 11
| #include<stdio.h> #include<stdlib.h>
int main() { int *p=(int *)malloc(sizeof(int)); *p=100; printf("%d\n",*p); free(p); printf("%d\n",*p); return 0; }
|