MST

星途 面试题库

面试题:C语言指针算术运算在内存管理与优化中的应用

在一个C程序中,有一个大的字符数组 `char largeArray[10000];` 用于存储文本数据。现在需要对这段数据进行加密操作,加密规则是将每个字符的ASCII码值加上一个偏移量(偏移量在程序运行时动态输入)。要求使用指针算术运算,在尽量少的内存占用和高效的时间复杂度下完成加密和解密操作。描述你的设计思路,包括如何利用指针算术运算优化内存访问,并写出关键代码片段,同时分析可能存在的内存安全问题及解决方案。
47.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 指针算术运算优化内存访问
    • 利用指针可以直接访问数组元素的特性,通过指针移动来遍历数组,避免使用数组下标访问的额外计算开销。对于一个字符数组 char largeArray[10000];,定义一个指针 char *ptr = largeArray;,然后通过 ptr++ 来移动指针,访问数组中的每个元素。这样在内存访问上更加高效,因为指针算术运算直接操作内存地址,减少了数组下标计算的时间。
  2. 加密操作
    • 在程序运行时获取动态输入的偏移量。使用指针遍历数组,对每个字符的ASCII码值加上偏移量进行加密。
  3. 解密操作
    • 解密是加密的逆过程,同样使用指针遍历数组,将每个字符的ASCII码值减去偏移量恢复原始数据。
  4. 内存安全问题及解决方案
    • 越界访问:在使用指针遍历数组时,有可能会因为错误的指针移动导致越界访问。解决方案是在遍历过程中确保指针不会超出数组边界。可以通过计算数组的长度,在循环条件中进行判断,例如在一个长度为 n 的数组中,使用 while (ptr < largeArray + n) 这样的条件来控制循环,防止指针越界。

关键代码片段

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

// 加密函数
void encrypt(char *data, int length, int offset) {
    char *ptr = data;
    while (ptr < data + length) {
        *ptr = *ptr + offset;
        ptr++;
    }
}

// 解密函数
void decrypt(char *data, int length, int offset) {
    char *ptr = data;
    while (ptr < data + length) {
        *ptr = *ptr - offset;
        ptr++;
    }
}

int main() {
    char largeArray[10000];
    int offset;
    printf("请输入偏移量: ");
    scanf("%d", &offset);
    // 假设这里已经从文件或其他方式读取数据到largeArray
    int length = sizeof(largeArray) / sizeof(largeArray[0]);
    encrypt(largeArray, length, offset);
    printf("加密后的数据: ");
    for (int i = 0; i < length; i++) {
        printf("%c", largeArray[i]);
    }
    printf("\n");
    decrypt(largeArray, length, offset);
    printf("解密后的数据: ");
    for (int i = 0; i < length; i++) {
        printf("%c", largeArray[i]);
    }
    printf("\n");
    return 0;
}

代码说明

  1. encrypt 函数:使用指针 ptr 遍历数组 data,对每个字符加上偏移量 offset 进行加密。
  2. decrypt 函数:使用指针 ptr 遍历数组 data,对每个字符减去偏移量 offset 进行解密。
  3. main 函数:获取用户输入的偏移量,调用加密和解密函数,并输出加密和解密后的数据。同时通过 sizeof 计算数组长度,确保在加密和解密过程中不会发生越界访问。