Head First C 笔记 - 动态存储

动态存储

很多场景是在程序运行前你不知道自己需要多少存储空间,比如网页响应前你就不知道需要多少存储空间。所以要在运行时动态创建,这个操作通常在上进行。

下面这个案例展示了程序运行时动态创建一个叫island的链表,包括了内存的申请和释放,最后打印显示。

#include <stdio.h>
#include <string.h>

typedef struct {
    char *name;
    char *opens;
    char *closes;
    struct island *next;
} island;

void display(island *start)
{
    island *i = start;
    for (; i != NULL; i = i->next) {
        printf("Island: %s", i->name);
    }
}

island* create(char *name)
{
    island *i = malloc(sizeof(island));
    i->name = strdup(name); // 这里使用了strdup函数,避免了潜在的共享指针错误p284
    i->opens = "09:00";
    i->closes = "17:00";
    return i;
}

void release(island *start)
{
    island *i = start;
    island *next = NULL;
    for (; i != NULL; i = next) {
        next = i->next;
        free(i->name);
        free(i);
    }
}

int main(int argc, char const *argv[])
{
    char name[50];
    island *start = NULL;
    island *i = NULL;
    island *next = NULL;
    for (; fgets(name, 50, stdin) != NULL; i = next) {
        next = create(name);
        if (start == NULL)
            start = next;
        if (i != NULL)
            i->next = next;
    }
    display(start);
    return 0;
}

注意几点:

  • 递归的结构体必须要使用typedef创建一个别名,所以才可以在结构体中定义:struct island *next;
  • 程序在运行时动态创建了链表,使用malloc()申请了堆内存,使用free()释放
  • 使用strdup()复制字符串,避免字符串共享指针导致的数据错误

标签: c

添加新评论