自学内容网 自学内容网

c语言之在结构体里面定义函数指针

还是在看redis3.0源码的时候,遇到如下问题:

这个时候我们回到list这个结构体的设计上面

 首先我们必须要注意的是函数名字就可以看成指针地址。

所以下面我们写一个简单的实例看一下具体的用法:

#include <stdio.h>
#include <stdlib.h>

typedef struct listNode {
    void *value;
    struct listNode *next;
} listNode;

typedef struct list {
    listNode *head;
    void (*free)(void *ptr);
} list;

void customFreeFunction(void *ptr) {
    printf("Freeing value: %s\n", (char *)ptr);
    free(ptr);  // 假设值是动态分配的字符串
}

void listRelease(list *myList) {
    listNode *current = myList->head;
    listNode *next;

    while (current) {
        next = current->next;

        // 如果设置了free函数,使用它来释放节点值
        if (myList->free) myList->free(current->value);
        
        free(current);  // 释放节点结构
        current = next;
    }
    
    free(myList);  // 释放链表结构
}

int main() {
    // 创建链表并分配第一个节点
    list *myList = malloc(sizeof(list));
    //这里让free指向了一个函数地址
    myList->free = customFreeFunction;  // 设置释放函数

    // 创建节点并赋值
    myList->head = malloc(sizeof(listNode));
    myList->head->value = malloc(20); // 为节点值分配空间
    snprintf(myList->head->value, 20, "Hello, Redis!");  // 设置值

    // 释放链表
    listRelease(myList);

    return 0;
}

大致相当于是做了一个套娃操作:1.我给head里面的value分配了一片空间,用来存放字符串。像上面这样的字符串空间大小就是20个空间大小。

2.我们想要释放这片空间,是先把包含head里面的value的这个结点传给listRelease

3.然后listRelease里面在去调用了free指向的函数进行释放,同时传入了value这个地址值。不考虑数据类型转换直接释放。

大致就这样。


原文地址:https://blog.csdn.net/Pxx520Tangtian/article/details/143490830

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!