动态分配内存
- 为什么需要动态分配内存:
1.存储的数据 需要延长生命周期
2.一个指针变量需要存储数据,变量本身只能存地址,不能存数据,需要分配内存空间来存储数据
#include <stdio.h>
#include <stdlib.h>
int main(){
//char name[100] = {};数组确定大小是为了分配内存空间
//如果使用指针变量接收数据
//必须先为这个指针变量分配一片指向的内存空间
//有内存空间 才能存数据
//使用malloc必须导入头文件stdlib.h
//使用malloc (memory alloc)申请内存空间
char *name ;
name = (char *)malloc(10*sizeof(char));
if(name == NULL){
// 申请内存失败
exit(EXIT_FAILURE);
}
scanf("%s", name);
printf("%s\n",name);
//使用realloc动态改变已经分配内存的大小
//增加或者减少
name = (char *)realloc(name, 20*sizeof(char));
//判断重新分配是否成功
if(name == NULL){
//退出之前必须将之前分配的内存释放掉
free(name);
exit(EXIT_FAILURE);//表示程序直接退出,如果此次分配不成功直接结束
//会导致之前malloc分配的内存泄漏,所以为了防止泄漏,在程序结束之前应该释放掉内存
}
//使用完毕必须自己手动释放内存
free(name);
return 0;
}
小实战之录入个人名单
合理使用内存
请输入姓名:jack
是否继续(y/n)?:y
请输入姓名:jackson
是否继续(y/n)?:n
录入2个人的信息
jack
jackson
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//从终端接收字符串 返回这个字符串的首地址
char *inputName(){
//1.定义一个指针变量 指向字符串的首地址
char *pName = NULL;
//2.接收输入
int i = 0;
//3.提示操作
printf("请输入人名:");
while (1) {
//接收一个字符
char c = getchar();
//判断这个字符是不是\n
if (c == '\n') {
//输入结束
break;
}
//判断是不是第一个字符
if(i == 0){
//使用malloc分配内存
pName = (char *)malloc(1*sizeof(char));
//判断是否分配成功
if(pName == NULL){
exit(EXIT_FAILURE);
}
pName[0] = c;
}else{
//使用realloc在之前的基础上加一个
pName = (char *)realloc(pName, (i+1)*sizeof(char));
//判断是否分配成功
if(pName == NULL){
exit(EXIT_FAILURE);
}
pName[i] = c;
}
i++;
}
//将当前的字符串首地址返回
return pName;
}
//是否继续
bool isContinue(){
printf("是否继续(y/n)?:");
while (1) {
char c = getchar();
getchar();
if (c == 'y'){
return true;
}else if(c == 'n'){
return false;
}else{
printf("输入格式不对,请重新输入:");
}
}
}
//初始化整个数组
char **initNames(int *pNum){
//1.定义指针变量指向每个名字的首地址的内存
char **pHead = NULL;
//2.记录元素个数
int i = 0;
while (1) {
//判断是不是第一个
//第一个使用malloc分配内存
if (i == 0) {
pHead = (char **)malloc(1*sizeof(char *));
if (pHead == NULL) {
exit(EXIT_FAILURE);
}
//输入人名 将地址放到pHead对应位置
pHead[0] = inputName();
}else{
//使用realloc重新再增加一个元素
pHead = (char **)realloc(pHead, (i+1)*sizeof(char *));
if (pHead == NULL) {
exit(EXIT_FAILURE);
}
//输入人名 将地址放到pHead对应位置
pHead[i] = inputName();
}
i++;
//是否继续
bool result = isContinue();
if (result == false) {
break;
}
}
*pNum = i;
return pHead;
}
void show(char **pHead, int num){
printf("输入%d个名字:\n",num);
for (int i = 0; i < num; i++) {
printf("%s\n",pHead[i]);
}
printf("\n");
}
int main(int argc, const char * argv[]) {
char **pHead = NULL;
int count = 0;
pHead = initNames(&count);
show(pHead, count);
return 0;
}