C 访问冲突读取位置0xFFFFFE

C 访问冲突读取位置0xFFFFFE,c,C,当程序显示数组时,我在0x00AD372D UCRTBASE.dll中引发了错误异常 我已经尝试过多次修复错误,但是当程序显示数组的输出时,它仍然显示错误,请给我一些建议。感谢阅读。函数inputArray中有一个双指针int**pa,其中您为*pa分配了空间。您正在向pa读取值。首先,您应该为pa分配内存,然后向其读取值 void inputArray(int* *pa, int *n) { do { printf("Input the elements: ");

当程序显示数组时,我在0x00AD372D UCRTBASE.dll中引发了错误异常 我已经尝试过多次修复错误,但是当程序显示数组的输出时,它仍然显示错误,请给我一些建议。感谢阅读。

函数inputArray中有一个双指针int**pa,其中您为*pa分配了空间。您正在向pa读取值。首先,您应该为pa分配内存,然后向其读取值

void inputArray(int* *pa, int *n)
{
    do {
        printf("Input the elements: ");
        scanf_s("%d", n);
        if (*n < 0)
        {
            printf("Error! Input again\n");
        }
    } while (*n < 0);
    *pa = (int*)malloc(*n * sizeof(int));
    for (int i = 0; i < *n; i++)
    {
        printf("Elements a[%d]: ", i);
        scanf_s("%d", pa + i);
    }

}

void outputArray(int* *pa, int n)
{
    printf("\nContent of the array\n");
    for (int i = 0; i < n; i++)
    {
        printf("a[%d] = %d\n", i, *(pa + i));
    }
}

int main()
{
    int *A;
    int n;
    inputArray(&A, &n);
    outputArray(&A, n);
    free(A);
    _getch();
    return 0;
}

调试器将向您显示问题所在

您将指针的地址传递给inputArray,并将其作为int**:很好

使用*pa=int*malloc*n*sizeofint;,分配数组:差不多好了。所有间接级别都是正确的,但您不应该在C中强制转换malloc应该:*pa=malloc*n*sizeofint

但是scanf_s%d,pa+i;这显然是错误的。pa是包含已分配数组地址的指针,因此数组位于*pa而不是pa。您应该写入scanf_s%d,*pa+i

对于outputArray,您没有理由传递指向数组的指针。但如果这样做,值将位于*pa[i],而不是与pa[i]相同的*pa+i,因此应使用:printfa[%d]=%d\n,i,*pa[i]

但正确的方法是:

 for (int i = 0; i < *n; i++)
{
    pa[i] = malloc(sizeof(int));
    printf("Elements a[%d]: ", i);
    scanf_s("%d", pa[i]);
}

你不需要演员阵容,谢谢你@艾德希尔。实际上它返回void*只是将typecast转换为int*请阅读并检查scanf returnvalue@ShihabPullissery当前位置我理解这是出于好意,但请不要发表感谢评论。要感谢的堆栈溢出方法是将这篇文章的评论也上传到上面。我建议我们删除最后的评论。@closers\u和\u Downvorters:这远不是一个好问题,但代码作为一个可接受的问题,问题描述为:程序崩溃。解释为什么这个问题如此糟糕的评论将是welcomed@SergeBallesta:读。@Olaf:好的,标题可能不太明确,研究可能不够充分。但《守则》确实是一个许多问题都没有提供的问题。因此,寻求调试帮助的最接近的原因是,为什么这段代码不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码,此处不适用!期望的行为:使程序运行,问题:崩溃,代码:存在并可编译。顺便说一句,我知道怎么问…@SergeBallesta:-代码不是MCVE,-没有具体的问题陈述,它在哪里崩溃?在什么条件下?但仅仅是调试我的代码请求,-没有预期的行为使程序运行-你一定是在开玩笑。仅仅提供一些简短的代码是不够的。有5万次重复,你应该知道。@Olaf:OP不知道如何使用调试器——如果他知道,他就不会问这个问题了。所以他不知道程序在哪里崩溃。无论如何,当程序调用UB时,输入数据几乎没有影响——但我同意,他应该给出一个输入示例。但是对于一个初学者来说,我认为OP是我不期望更多的。他想在一个函数中分配和输入一个数组,然后在另一个函数中输出它所有的代码都与这个问题有关。他无法理解发生了什么。正如我所说,这远不是一个好问题,但我认为结束原因是不公平的。但我有一个问题,我试图从*pa+I改为*pa+I,有不同的值。你能给我解释一下吗?@VũNguyễ这是一个运营商优先级和分组的问题*pa+1是*pa+i,而不是*pa+i。想想2+3*4 14,因为它实际上是2+3*4,而不是2+3*4。我很抱歉我缺乏编码知识,我刚刚学了几个星期,所以如果我不知道如何在这里提出问题,请与我分享。祝你一天愉快谢谢,我刚拿到。
void outputArray(int *pa, int n)
{
    printf("\nContent of the array\n");
    for (int i = 0; i < n; i++)
    {
        printf("a[%d] = %d\n", i, pa[i]);
    }
}
...
outputArray(A, n);