MST
星途 面试题库

面试题:C语言指向指针的指针在动态内存分配中的应用

编写一个函数,该函数接收一个整数n,动态分配一个二维字符数组,数组有n行,每行的字符数在运行时确定(通过用户输入)。使用指向指针的指针来管理这个二维数组,并且实现对每一行字符串的输入、输出以及内存释放的功能。请写出完整的C语言代码及关键步骤的注释。
30.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 函数声明
void inputStrings(char **strings, int n);
void outputStrings(char **strings, int n);
void freeStrings(char **strings, int n);

int main() {
    int n;
    printf("请输入行数: ");
    scanf("%d", &n);

    // 动态分配二维数组的指针数组
    char **strings = (char **)malloc(n * sizeof(char *));
    if (strings == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    inputStrings(strings, n);
    printf("输入的字符串如下:\n");
    outputStrings(strings, n);
    freeStrings(strings, n);

    return 0;
}

// 输入字符串
void inputStrings(char **strings, int n) {
    for (int i = 0; i < n; i++) {
        int length;
        printf("请输入第 %d 行字符串的长度: ", i + 1);
        scanf("%d", &length);

        // 动态分配每一行的内存
        strings[i] = (char *)malloc((length + 1) * sizeof(char));
        if (strings[i] == NULL) {
            printf("内存分配失败\n");
            // 释放之前分配的内存
            for (int j = 0; j < i; j++) {
                free(strings[j]);
            }
            free(strings);
            exit(1);
        }

        printf("请输入第 %d 行字符串: ", i + 1);
        scanf("%s", strings[i]);
    }
}

// 输出字符串
void outputStrings(char **strings, int n) {
    for (int i = 0; i < n; i++) {
        printf("第 %d 行字符串: %s\n", i + 1, strings[i]);
    }
}

// 释放内存
void freeStrings(char **strings, int n) {
    for (int i = 0; i < n; i++) {
        free(strings[i]);
    }
    free(strings);
}

关键步骤注释:

  1. main函数
    • 首先获取用户输入的行数n
    • 然后动态分配一个指针数组strings,用于存储指向每一行字符串的指针。
    • 调用inputStrings函数输入字符串,outputStrings函数输出字符串,最后调用freeStrings函数释放内存。
  2. inputStrings函数
    • 遍历每一行,获取用户输入的该行字符串长度length
    • 为每一行动态分配内存,大小为length + 1(包含字符串结束符'\0')。
    • 如果内存分配失败,释放之前分配的内存并退出程序。
    • 获取用户输入的该行字符串。
  3. outputStrings函数
    • 遍历每一行并输出字符串。
  4. freeStrings函数
    • 遍历每一行释放每一行分配的内存,最后释放存储指针的数组strings