MST

星途 面试题库

面试题:C语言回调函数与内存管理及跨模块交互

假设你正在开发一个大型C语言项目,其中有多个模块,一个模块`moduleA`负责数据采集,采集到的数据需要传递给另一个模块`moduleB`进行处理,`moduleB`通过回调函数接收数据。同时,数据采集涉及到动态内存分配,在传递给`moduleB`处理后需要正确释放内存。请设计一个合理的架构并给出关键代码片段,确保内存管理正确且回调函数机制稳定可靠,并且能够清晰展示模块间的数据交互。
18.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

1. 架构设计

  • 定义数据结构:用于存储采集的数据。
  • 模块 moduleA:负责数据采集,动态分配内存存储数据,并通过回调函数将数据传递给 moduleB
  • 模块 moduleB:提供回调函数,接收 moduleA 传递的数据并进行处理,处理完成后通知 moduleA 释放内存。

2. 关键代码片段

定义数据结构

// 定义数据结构用于存储采集的数据
typedef struct {
    int data[100]; // 假设采集的数据是一个整数数组
    int length;
} Data;

moduleA 代码

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

// 回调函数指针类型定义
typedef void (*DataProcessCallback)(Data*);

// moduleA 采集数据并通过回调传递给 moduleB
void moduleA(DataProcessCallback callback) {
    Data *data = (Data *)malloc(sizeof(Data));
    if (data == NULL) {
        fprintf(stderr, "Memory allocation failed\n");
        return;
    }
    // 模拟数据采集
    data->length = 10;
    for (int i = 0; i < data->length; i++) {
        data->data[i] = i;
    }

    // 通过回调函数将数据传递给 moduleB
    callback(data);
}

moduleB 代码

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

// moduleB 的回调函数,处理数据
void moduleBProcess(Data *data) {
    // 处理数据
    printf("moduleB received data: ");
    for (int i = 0; i < data->length; i++) {
        printf("%d ", data->data[i]);
    }
    printf("\n");

    // 处理完成后通知 moduleA 释放内存
    free(data);
}

主函数

#include <stdio.h>

int main() {
    // 将 moduleB 的回调函数传递给 moduleA
    moduleA(moduleBProcess);
    return 0;
}

3. 说明

  • 数据结构 Data:定义了存储采集数据的结构,这里假设采集的数据是一个整数数组及数组长度。
  • moduleA:通过 malloc 动态分配内存创建 Data 结构体实例,模拟数据采集后,调用传入的回调函数将数据传递给 moduleB
  • moduleB:提供 moduleBProcess 回调函数,接收 moduleA 传递的数据进行处理,处理完成后通过 free 释放 moduleA 分配的内存,确保内存管理正确。
  • 主函数:将 moduleB 的回调函数 moduleBProcess 传递给 moduleA,触发数据采集和传递流程。