You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言:动态二维指针数组存储用户输入字符串异常求助(VS2017)

嘿,我来帮你搞定这个动态二维指针数组的问题~

问题分析与修复方案

你遇到的输出异常大概率是内存分配或指针引用错误导致的——动态二维指针数组需要先分配外层指针数组的空间,再为每个字符串单独分配内存存储用户输入内容,要是这两步没做好,就会出现野指针或者内存访问异常。

我先给你一个修复后的完整代码,再逐点解释关键问题:

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

#define MAX_STR_LEN 100  // 定义单个字符串的最大长度,可按需调整

int main() {
    int count;
    printf("请输入要存储的字符串个数:");
    scanf("%d", &count);
    getchar();  // 吃掉scanf留下的换行符,避免后续读取空字符串

    // 第一步:分配外层指针数组的空间,每个元素是char*类型
    char** strArray = (char**)malloc(count * sizeof(char*));
    if (strArray == NULL) {
        printf("内存分配失败!\n");
        return 1;
    }

    // 第二步:逐个读取字符串,并为每个字符串分配内存
    for (int i = 0; i < count; i++) {
        char temp[MAX_STR_LEN];
        printf("请输入第%d个字符串:", i + 1);
        fgets(temp, MAX_STR_LEN, stdin);  // 用fgets更安全,避免缓冲区溢出
        
        // 去掉fgets读取到的换行符(如果存在)
        temp[strcspn(temp, "\n")] = '\0';
        
        // 为当前字符串分配内存,长度是实际长度+1(存终止符'\0')
        strArray[i] = (char*)malloc(strlen(temp) + 1);
        if (strArray[i] == NULL) {
            printf("第%d个字符串内存分配失败!\n", i + 1);
            // 分配失败时释放已分配的内存,避免泄漏
            for (int j = 0; j < i; j++) {
                free(strArray[j]);
            }
            free(strArray);
            return 1;
        }
        // 将临时字符串复制到分配好的内存中
        strcpy(strArray[i], temp);
    }

    // 打印每个字符的位置和内容,用于测试
    printf("\n===== 测试输出 =====\n");
    for (int i = 0; i < count; i++) {
        printf("第%d个字符串:", i + 1);
        for (int j = 0; strArray[i][j] != '\0'; j++) {
            printf("(第%d位: '%c') ", j + 1, strArray[i][j]);
        }
        printf("\n");
    }

    // 释放所有动态分配的内存,避免内存泄漏
    for (int i = 0; i < count; i++) {
        free(strArray[i]);
    }
    free(strArray);

    return 0;
}

关键修复点解释

  • 处理输入换行符:用scanf读取数字后,输入缓冲区会留下换行符,必须用getchar()吃掉,否则后续fgets会直接读取到空字符串。
  • 分两步分配内存:
    1. 先给外层的char**数组分配空间,大小是count * sizeof(char*),每个元素对应一个字符串的指针。
    2. 再为每个字符串单独分配内存,长度是输入字符串的实际长度+1(C字符串需要'\0'作为终止符)。
  • 安全读取字符串:用fgets代替gets,避免缓冲区溢出;同时用strcspn去掉fgets读取到的换行符,保证字符串格式正确。
  • 内存泄漏防护:如果中途内存分配失败,要释放已经分配的内存;程序结束前也要释放所有动态分配的内存,避免内存泄漏。
  • 正确访问字符:通过strArray[i][j]访问第i个字符串的第j个字符,确保指针指向有效的内存区域。

常见错误排查

如果你的原代码还有其他问题,可能是以下情况:

  • 只分配了外层指针数组的空间,但没有为每个字符串分配内存,导致strArray[i]是野指针,访问时出现异常。
  • 直接把输入的字符串赋值给strArray[i](比如strArray[i] = temp;),但temp是栈上的临时变量,函数结束后内存会被释放,导致后续访问无效。
  • 没有处理'\0'终止符,导致打印时越界访问内存。

你可以对照上面的代码和解释修改原程序,应该就能解决输出异常的问题啦~

内容的提问来源于stack exchange,提问作者user9405224

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:16:14