MST

星途 面试题库

面试题:C语言结构体与函数指针及动态内存管理

设计一个程序,其中包含一个结构体,结构体中有一个函数指针成员,该函数指针指向一个用于计算两个数之和的函数。程序要实现动态分配结构体数组,并为每个结构体元素的函数指针成员赋值,最后调用这些函数指针进行计算并输出结果。请详细说明设计思路、实现代码以及如何处理动态内存的分配与释放以避免内存泄漏。
32.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义结构体:定义一个包含函数指针成员的结构体,该函数指针指向计算两个数之和的函数。
  2. 动态分配结构体数组:使用mallocC++中的new来动态分配结构体数组内存。
  3. 初始化函数指针:为每个结构体元素的函数指针成员赋值,指向计算两个数之和的函数。
  4. 调用函数指针并输出结果:遍历结构体数组,调用每个元素的函数指针,计算并输出结果。
  5. 内存释放:使用freeC语言)或delete[]C++)释放动态分配的内存,避免内存泄漏。

实现代码(C语言示例)

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

// 定义计算两个数之和的函数
int add(int a, int b) {
    return a + b;
}

// 定义结构体
typedef struct {
    int (*func)(int, int); // 函数指针
} Calculator;

int main() {
    int n = 3; // 假设分配3个结构体元素
    Calculator *calculators = (Calculator *)malloc(n * sizeof(Calculator));
    if (calculators == NULL) {
        perror("malloc");
        return 1;
    }

    // 为每个结构体元素的函数指针赋值
    for (int i = 0; i < n; i++) {
        calculators[i].func = add;
    }

    // 调用函数指针并输出结果
    for (int i = 0; i < n; i++) {
        int result = calculators[i].func(2, 3); // 假设计算2 + 3
        printf("Result of calculation %d: %d\n", i + 1, result);
    }

    // 释放内存
    free(calculators);

    return 0;
}

实现代码(C++示例)

#include <iostream>

// 定义计算两个数之和的函数
int add(int a, int b) {
    return a + b;
}

// 定义结构体
struct Calculator {
    int (*func)(int, int); // 函数指针
};

int main() {
    int n = 3; // 假设分配3个结构体元素
    Calculator *calculators = new Calculator[n];

    // 为每个结构体元素的函数指针赋值
    for (int i = 0; i < n; i++) {
        calculators[i].func = add;
    }

    // 调用函数指针并输出结果
    for (int i = 0; i < n; i++) {
        int result = calculators[i].func(2, 3); // 假设计算2 + 3
        std::cout << "Result of calculation " << i + 1 << ": " << result << std::endl;
    }

    // 释放内存
    delete[] calculators;

    return 0;
}

动态内存分配与释放

  1. C语言:使用malloc分配内存,如果分配失败,malloc返回NULL,需要进行错误处理。使用free释放内存,并且只释放一次,避免多次释放导致未定义行为。
  2. C++:使用new分配内存,如果分配失败,会抛出std::bad_alloc异常。使用delete[]释放动态分配的数组内存,确保配对使用new[]delete[],以正确调用对象的析构函数(如果有)并释放内存,防止内存泄漏。