c - 读取位置 0xFFFFFFFE 时发生访问冲突

标签 c

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;
}

当程序显示数组时,我收到错误“Exception returned at 0x00AD372D (ucrtbased.dll)” 我尝试了很多次来修复该错误,但当程序显示数组的输出时,它仍然显示该错误,请给我一些建议。感谢您的阅读。

最佳答案

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

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

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

但是scanf_s("%d", pa + i);完全错误。 pa是一个指针,包含已分配数组的地址,因此该数组位于 *pa不在pa 。你应该写scanf_s("%d", *pa + i);

对于outputArray ,您没有理由将指针传递给数组。但如果这样做,值将是 (*pa)[i] ,不在 *(pa + i)pa[i] 相同,所以你应该使用:printf("a[%d] = %d\n", i, (*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]);
    }
}
...
outputArray(A, n);

关于c - 读取位置 0xFFFFFFFE 时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42693049/

相关文章:

c - 是否有任何普通理由使用 open() 而不是 fopen()?

c - Vala(类 C# 语言)编译成 C?

c - 生成文件问题

字符数组打印额外的垃圾内存

c - 动态二维数组特定行的意外输出

c++ - 在 C++ 中将 char * 转换为枚举

c - 通过递归将指针传递给结构(迷宫求解)

c - 将链表写入二进制文件(C)

c - ARMv7 汇编函数中查找数组最大元素时出现总线错误

C 无垃圾 char 指针