什么是动态内存,为什么用到动态内存
malloc允许用户自行申请指定大小的内存,在字符数组的学习过程中,我们可能遇到如下问题:
事先不知道存放字符串的长度,因此会设定一个长度足够大的数组,这样就造成了内存的浪费。
但是借用malloc,就可以实现需要多少内存,就申请多少内存的效果。接下来介绍两种方法实现动态内存。
1.指针缓存
#include <stdio.h>
#include <stdlib.h>
#define NAMEMAX 20
int main(void) {
char *tmpname = malloc(NAMEMAX);
scanf("%s",tmpname);
char* name = malloc(sizeof(tmpname) + 1);
strcpy(name,tmpname);
free(tmpname);
printf("namelen = %d\n", strlen(name));
printf("name = %s\n", name);
return 0;
}
与传统的赋值相比,这里采用一个指针来暂存内容,后面使用free来释放暂存空间,所以实际存储空间就是字符串的大小。
2.动态顺序表
数据结构中的顺序表,其本质还是一个数组,当使用动态方式创建顺序表时,就产生了一个可变长数组
#include <stdio.h>
#include <stdlib.h>
// 定义顺序表结构体
typedef struct {
char* data;
int capacity;
} SeqList;
int main(void) {
char str[] = "hello world";
SeqList* list = malloc(sizeof(SeqList));
list->capacity = sizeof(str) + 1;
list->data = malloc(list->capacity * sizeof(char));
for (int i = 0; i < list->capacity; i++) {
*(list->data + i) = str[i];
}
for (int i = 0; i < list->capacity; i++) {
printf("data[%d] = %c\n", i, *(list->data + i));
}
return 0;
}