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会直接读取到空字符串。 - 分两步分配内存:
- 先给外层的
char**数组分配空间,大小是count * sizeof(char*),每个元素对应一个字符串的指针。 - 再为每个字符串单独分配内存,长度是输入字符串的实际长度+1(C字符串需要
'\0'作为终止符)。
- 先给外层的
- 安全读取字符串:用
fgets代替gets,避免缓冲区溢出;同时用strcspn去掉fgets读取到的换行符,保证字符串格式正确。 - 内存泄漏防护:如果中途内存分配失败,要释放已经分配的内存;程序结束前也要释放所有动态分配的内存,避免内存泄漏。
- 正确访问字符:通过
strArray[i][j]访问第i个字符串的第j个字符,确保指针指向有效的内存区域。
常见错误排查
如果你的原代码还有其他问题,可能是以下情况:
- 只分配了外层指针数组的空间,但没有为每个字符串分配内存,导致
strArray[i]是野指针,访问时出现异常。 - 直接把输入的字符串赋值给
strArray[i](比如strArray[i] = temp;),但temp是栈上的临时变量,函数结束后内存会被释放,导致后续访问无效。 - 没有处理
'\0'终止符,导致打印时越界访问内存。
你可以对照上面的代码和解释修改原程序,应该就能解决输出异常的问题啦~
内容的提问来源于stack exchange,提问作者user9405224
相关产品推荐
相关产品推荐

