C语言学习——动态内存
感觉C语言真的好神奇
- 两个主要方法
- 为何要使用动态内存
- 简单示例
- 综合案例
运行报错处理
- 报错1
- 报错2
两个主要方法
malloc(n);参数为所申请内存的字节数
free(p);参数为申请内存里获取的首地址
为何要使用动态内存
结合到数组的局限性:数组中元素的个数是固定不变的,太少会报错,太多会浪费内存。
简单示例
char* p=(char*)malloc(8);
//申请了八个字节数的char类型的内存
for(int i=0;i<8;i++){
p[i]=i+1;
}
free(p);
//释放所申请的内存
综合案例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Car{
int price;
char host[8];
};
struct Person{
char name[12];
int money;
Car* car;
};
Person* buy(Person* p){
//先计算Car所占的字节数,然后再申请相应的内存
Car* c=(Car*)malloc(sizeof(Car));
c->price=10;
strcpy(c->host,"zwq1");
p->car=c;
p->money -= c->price;
return p;
};
Person* change(Person* p1,Person* p2){
p2->car=p1->car;
strcpy(p2->car->host,"zwq2");
p1->money +=(p2->car->price)*0.5;
p2->money -=(p2->car->price)*0.5;
return p2;
}
int main(){
Person p1={
"zwq1",20,NULL};
Person p2={
"zwq2",20,NULL};
Person* p1_=buy(&p1);
//买车
Person* p2_=change(&p1,&p2);
//换车
printf("p1名字是%s,余额是%d\n",p1_->name,p1_->money);
printf("p2名字是%s,余额是%d\n",p2_->name,p2_->money);
printf("车辆归属者是%s\n",p2_->car->host);
free(p1_->car);
p1_->car=NULL;
return 0;
}
运行报错处理
报错1
原因:申请的内存过小,所赋的值超过申请的内存
例如把上述综合案例做一点修改
struct Car{
int price;
//这里把8改成4
char host[4];
};
报错2
原因:关闭了没有申请内存的指针
例如把上述综合案例做一点修改:在main函数中的return 0;
前面添加 free(p2_->car);
还没有评论,来说两句吧...