面试题答案
一键面试设计思路
- 封装数组操作:通过自定义函数来替代直接的数组访问操作,在函数内部进行边界检查。
- 宏定义简化调用:使用宏定义来简化自定义函数的调用,使其看起来更像常规的数组访问。
- 记录数组大小:在自定义的数据结构中记录数组的大小,以便在访问时进行越界判断。
核心代码实现
#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
用于释放内存。getElement
和setElement
函数在访问数组元素前进行越界检查,通过assert
来确保程序的健壮性。宏定义SAFE_GET
和SAFE_SET
简化了对安全数组的访问操作。