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

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属于无意义的重复赋值,逻辑冗余。

修复方案

修改逻辑

  1. 调整内存分配逻辑:先根据输入的行数n,为二级指针分配n个char*的空间,再为每一行单独分配100字节的字符串存储空间。
  2. 修正函数调用参数,移除未定义的参数m。
  3. 读取行数后清空输入缓冲区,避免gets_s读入空行。
  4. 移除冗余的返回值赋值逻辑。

修复后代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:06:03