【问题标题】:Access violation writing location while filling the matrix填充矩阵时访问冲突写入位置
【发布时间】:2021-12-07 16:18:37
【问题描述】:
char *inputForMidTask(int &n, char **ptr) {
    printf("Enter the amount of rows: \n");
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
            gets_s(*(ptr + i), 100); //throws exception here
    }
    return *ptr;
}

void byString() {
    int n;
    char **ptr = (char**)malloc(255 * 255 * sizeof(char));
    *ptr = inputForMidTask(n, m, ptr);
}

你好!我需要逐个字符串填写矩阵字符串,但我不断收到异常错误 - Lab2_Algs.exe 中的 0x78D6FA8D (ucrtbased.dll) 抛出异常:0xC0000005:访问冲突写入位置 0xCDCDCDCD。 附: **ptr 的内存是使用函数 malloc 动态分配的

【问题讨论】:

  • 欢迎来到 Stack Overflow。需要完整的代码。请参阅:minimal reproducible example。另外,请使用tour 并阅读How to Ask
  • 我的猜测是调用者没有为字符串数组分配内存,你应该在函数中进行内存分配。
  • 我尝试在该函数中进行内存分配,但它并不顺利,我遇到了一个异常,上面写着:“nullptr”。
  • int &amp;n 是 C++。 C 没有引用变量。
  • 您的内存分配并没有分配您认为分配的内容。您需要分配一个包含 255 个指针的块,然后为每个指针分配一个包含 255 个字符的块。或者大约相当于那个的东西。并且参数列表中的int &amp;n 是 C++,而不是 C。

标签: arrays c pointers matrix


【解决方案1】:

您的 byString 函数分配了一个大缓冲区,但您的 inputForMidTask 函数需要 n 小缓冲区。目前尚不清楚如何修复它,因为没有解释 inputForMidTask 应该做什么。最有可能的是,应该将其更改为分配 n 小缓冲区,而 byString 应仅更改为分配足够的空间来保存指向小缓冲区的指针。

【讨论】:

    【解决方案2】:

    char **ptr 表示它是一个指针数组。但是你分配了一个255*255 字符数组,而不是指针。

    应该是:

    char **ptr = malloc(255 * sizeof(char*));
    for (int i = 0; i < 255; i++) {
        ptr[i] = malloc(255 * sizeof(char));
    }
    

    您也从未在调用inputForMidTask() 之前设置n

    返回*ptr 并没有多大意义。这只是返回第一行。

    【讨论】:

    • 感谢您的帮助!现在可以了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2020-09-04
    • 1970-01-01
    • 2015-08-15
    • 2012-12-05
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多