MST
星途 面试题库

面试题:C语言字符串指针复杂操作及内存管理

假设有一个二维字符数组存储了若干字符串,要求通过字符串指针操作,将这些字符串按字典序排列。请详细说明实现思路,并编写相应代码,同时指出在这个过程中,对字符串指针操作可能会出现的内存泄漏、越界等问题及解决办法。
27.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义字符串指针数组:首先,定义一个指针数组,用于存储二维字符数组中每个字符串的首地址。这样,通过操作指针数组,就能间接操作字符串。
  2. 字符串排序:使用一种排序算法(如冒泡排序、快速排序等)对指针数组进行排序。在比较时,利用 strcmp 函数来比较两个指针所指向的字符串,以确定它们的字典序。
  3. 更新二维字符数组:排序完成后,根据指针数组的顺序,更新二维字符数组中字符串的顺序。

代码实现

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

// 比较函数,用于qsort
int compare(const void *a, const void *b) {
    return strcmp(*(char **)a, *(char **)b);
}

void sortStrings(char arr[][100], int n) {
    char *pointers[100]; // 假设最多100个字符串
    int i;

    // 初始化指针数组
    for (i = 0; i < n; i++) {
        pointers[i] = arr[i];
    }

    // 使用qsort对指针数组进行排序
    qsort(pointers, n, sizeof(char *), compare);

    // 更新二维字符数组
    for (i = 0; i < n; i++) {
        strcpy(arr[i], pointers[i]);
    }
}

int main() {
    char arr[][100] = {"banana", "apple", "cherry"};
    int n = sizeof(arr) / sizeof(arr[0]);

    sortStrings(arr, n);

    int i;
    for (i = 0; i < n; i++) {
        printf("%s\n", arr[i]);
    }

    return 0;
}

可能出现的问题及解决办法

  1. 内存泄漏

    • 问题:如果在动态分配内存来存储字符串指针或字符串本身时,没有正确释放内存,就会导致内存泄漏。例如,如果使用 malloc 分配了存储字符串的空间,但没有调用 free
    • 解决办法:确保所有动态分配的内存都有对应的释放操作。在本代码中,由于使用的是固定大小的二维数组,不存在动态分配内存的情况,所以没有内存泄漏风险。但如果是动态分配的内存,在使用完后要及时调用 free
  2. 越界问题

    • 数组越界
      • 问题:在访问二维字符数组或指针数组时,如果索引超出了有效范围,就会发生越界。例如,在 sortStrings 函数中,如果 n 是一个非法值(如负数或大于数组实际大小),访问 arr[i]pointers[i] 就会越界。
      • 解决办法:确保在访问数组时,索引值在有效范围内。在本代码中,n 是通过 sizeof(arr) / sizeof(arr[0]) 正确计算得出的,保证了索引的有效性。
    • 字符串越界
      • 问题:在使用 strcpy 等字符串操作函数时,如果目标缓冲区大小不足以容纳源字符串(包括终止符 \0),就会导致字符串越界。例如,如果 arr[i] 的大小不足以存储 pointers[i] 指向的字符串。
      • 解决办法:确保目标缓冲区足够大来存储源字符串。在本代码中,arr 数组的每个元素大小为100,假设所有字符串长度都不会超过99,保证了 strcpy 操作的安全性。如果是动态分配的目标缓冲区,要根据源字符串长度动态分配足够大小的空间。