MST

星途 面试题库

面试题:C语言指针与数组等价性的深度优化与安全考量

编写一段C语言代码,模拟实现一个简单的动态数组(类似于C++ 的vector),利用指针与数组的等价性。要求具备添加元素、删除元素、获取指定位置元素的功能,并且要考虑内存安全和性能优化,如动态内存分配策略、指针运算的合理性等。在代码中适当添加注释说明关键步骤。
30.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>

// 定义动态数组结构体
typedef struct {
    int *data;    // 存储数据的指针
    int size;     // 当前元素个数
    int capacity; // 数组容量
} DynamicArray;

// 初始化动态数组
DynamicArray* createDynamicArray(int initialCapacity) {
    DynamicArray *arr = (DynamicArray*)malloc(sizeof(DynamicArray));
    if (arr == NULL) {
        return NULL;
    }
    arr->data = (int*)malloc(initialCapacity * sizeof(int));
    if (arr->data == NULL) {
        free(arr);
        return NULL;
    }
    arr->size = 0;
    arr->capacity = initialCapacity;
    return arr;
}

// 添加元素到动态数组
void addElement(DynamicArray *arr, int value) {
    if (arr->size == arr->capacity) {
        // 扩容
        arr->capacity *= 2;
        arr->data = (int*)realloc(arr->data, arr->capacity * sizeof(int));
        if (arr->data == NULL) {
            // 处理内存分配失败
            fprintf(stderr, "内存分配失败\n");
            exit(EXIT_FAILURE);
        }
    }
    arr->data[arr->size++] = value;
}

// 删除指定位置的元素
void deleteElement(DynamicArray *arr, int index) {
    if (index < 0 || index >= arr->size) {
        // 处理越界
        fprintf(stderr, "索引越界\n");
        return;
    }
    for (int i = index; i < arr->size - 1; i++) {
        arr->data[i] = arr->data[i + 1];
    }
    arr->size--;
    // 可考虑缩容逻辑,这里暂不实现
}

// 获取指定位置的元素
int getElement(DynamicArray *arr, int index) {
    if (index < 0 || index >= arr->size) {
        // 处理越界
        fprintf(stderr, "索引越界\n");
        exit(EXIT_FAILURE);
    }
    return arr->data[index];
}

// 释放动态数组内存
void freeDynamicArray(DynamicArray *arr) {
    free(arr->data);
    free(arr);
}

int main() {
    DynamicArray *arr = createDynamicArray(2);
    addElement(arr, 10);
    addElement(arr, 20);
    addElement(arr, 30);

    printf("获取第二个元素: %d\n", getElement(arr, 1));

    deleteElement(arr, 1);
    printf("删除第二个元素后,获取第二个元素: %d\n", getElement(arr, 1));

    freeDynamicArray(arr);
    return 0;
}