MST

星途 面试题库

面试题:C语言中如何检测数组越界错误

在C语言标准库不提供直接检测数组越界功能的情况下,设计一个通用的机制(可以借助自定义函数、宏等)来尽可能检测出程序运行过程中的数组越界错误,描述该机制的设计思路,并给出核心代码实现。
31.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 封装数组操作:通过自定义函数来替代直接的数组访问操作,在函数内部进行边界检查。
  2. 宏定义简化调用:使用宏定义来简化自定义函数的调用,使其看起来更像常规的数组访问。
  3. 记录数组大小:在自定义的数据结构中记录数组的大小,以便在访问时进行越界判断。

核心代码实现

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

// 自定义数组结构体
typedef struct {
    int *data;
    size_t size;
} SafeArray;

// 初始化安全数组
SafeArray* createSafeArray(size_t size) {
    SafeArray *arr = (SafeArray*)malloc(sizeof(SafeArray));
    if (arr == NULL) {
        perror("malloc");
        return NULL;
    }
    arr->data = (int*)malloc(size * sizeof(int));
    if (arr->data == NULL) {
        perror("malloc");
        free(arr);
        return NULL;
    }
    arr->size = size;
    return arr;
}

// 释放安全数组
void freeSafeArray(SafeArray *arr) {
    if (arr != NULL) {
        free(arr->data);
        free(arr);
    }
}

// 获取安全数组元素
int getElement(SafeArray *arr, size_t index) {
    assert(arr != NULL);
    assert(index < arr->size);
    return arr->data[index];
}

// 设置安全数组元素
void setElement(SafeArray *arr, size_t index, int value) {
    assert(arr != NULL);
    assert(index < arr->size);
    arr->data[index] = value;
}

// 宏定义简化访问
#define SAFE_GET(arr, index) getElement(arr, index)
#define SAFE_SET(arr, index, value) setElement(arr, index, value)

你可以使用以下方式调用:

int main() {
    SafeArray *arr = createSafeArray(5);
    if (arr == NULL) {
        return 1;
    }
    SAFE_SET(arr, 0, 10);
    printf("Element at index 0: %d\n", SAFE_GET(arr, 0));
    freeSafeArray(arr);
    return 0;
}

在这个实现中,SafeArray结构体封装了数组及其大小。createSafeArray函数用于初始化安全数组,freeSafeArray用于释放内存。getElementsetElement函数在访问数组元素前进行越界检查,通过assert来确保程序的健壮性。宏定义SAFE_GETSAFE_SET简化了对安全数组的访问操作。