C语言填充字符矩阵时出现Access violation writing location报错求助
问题产生原因
- 二级指针内存分配逻辑错误:你定义的
char **ptr是字符串数组的指针,首先需要分配存储N个char*(每行字符串首地址)的内存空间,而你当前的malloc(255 * 255 * sizeof(char))直接分配了char类型的连续内存,没有为每行的指针预留存储空间,导致*(ptr + i)拿到的是未初始化的野指针。异常地址0xCDCDCDCD正是Windows调试模式下未初始化堆内存的典型标记,访问野指针写入会直接触发段错误。 - 函数调用参数不匹配:
byString函数中调用inputForMidTask时传入了未定义的变量m,属于语法错误,会触发未定义行为。 - 输入缓冲区残留换行符:
scanf("%d", &n)读取行数后,输入缓冲区会残留一个换行符,后续第一次调用gets_s会直接读取到空内容,不符合业务预期。 - 函数返回值逻辑错误:
inputForMidTask返回*ptr也就是第一行字符串的首地址,你直接赋值给*ptr属于无意义的重复赋值,逻辑冗余。
修复方案
修改逻辑
- 调整内存分配逻辑:先根据输入的行数n,为二级指针分配n个
char*的空间,再为每一行单独分配100字节的字符串存储空间。 - 修正函数调用参数,移除未定义的参数m。
- 读取行数后清空输入缓冲区,避免
gets_s读入空行。 - 移除冗余的返回值赋值逻辑。
修复后代码
#include <stdio.h> #include <stdlib.h> // 调整返回值为void,无需返回冗余指针,若使用纯C环境不支持引用传参,可将int& n改为int* n void inputForMidTask(int &n, char **ptr) { printf("Enter the amount of rows: \n"); scanf("%d", &n); // 清空输入缓冲区残留的换行符 while(getchar() != '\n'); // 为二级指针分配n个char*的存储空间 ptr = (char**)malloc(n * sizeof(char*)); for (int i = 0; i < n; ++i) { // 为每一行单独分配100字节的字符串存储空间 *(ptr + i) = (char*)malloc(100 * sizeof(char)); gets_s(*(ptr + i), 100); } } void byString() { int n; char **ptr = NULL; // 修正参数,移除未定义的m inputForMidTask(n, ptr); // 此处添加你使用ptr矩阵的业务逻辑 // 使用结束后释放内存避免泄漏 for (int i = 0; i < n; ++i) { free(*(ptr + i)); } free(ptr); }
内容的提问来源于stack exchange,提问作者v1shn3vsk7
相关产品推荐
相关产品推荐

