指针和写访问冲突

时间:2017-03-29 13:24:16

标签: c pointers

所以我在学校得到了一个包含3个strix(int ***)的作业 我需要在“指针”中写入一些int值,但是当我尝试这样做时会出现错误。这是我的代码:

void main()
{
    unsigned int size, i;
    int arr[SIZE];
    int ** pointers;
    int ascend_flag;

    printf("Please enter the number of items:\n");
    scanf("%u", &size);
    for (i = 0; i < size; i++)
        scanf("%d", &arr[i]);
    scanf("%d", &ascend_flag);

    pointerSort(arr, size, (char)ascend_flag, &pointers);
    printf("The sorted array:\n"); //Print the sorted array
    printPointers(pointers, size);
    free(pointers);
}

void pointerSort(int* arr, unsigned int size, char ascend_flag,
        int *** pointers)
{
    int i, j;

    pointers = (int ***) malloc(size * sizeof(int **));
    for (i = 0; i < size; i++)
    {
        ***(pointers+i) = *&arr[i];
    }

    mergeSort(*pointers, size);

    if (ascend_flag == 0)
    {
        for (i = 0, j = size - 1; i < (size / 2); i++, j--)
        {
            swapInArr(**(pointers + i), **(pointers + j));
        }
    }
}

调试器显示错误发生在此循环中:

 for (i = 0; i < size; i++)
 {
     ***(pointers+i) = *&arr[i];
 }

具体来说,我不断收到此错误:

  

Project3.exe中0x0127192A抛出异常:0xC0000005:Access   违规阅读地点0xCDCDCDCD。

     

如果存在此异常的处理程序,则程序可能是安全的   继续

我承认该程序不完整,并且可能存在与我所遇到的错误无关的方式存在缺陷。请关注与访问冲突错误相关的问题。

1 个答案:

答案 0 :(得分:2)

pointers = (int***)malloc(size * sizeof(int**));

上面的语句是分配一块内存并将其分配给pointers,它可以像pointers[0]之类的数组一样使用,或像pointers+0一样使用。

***(pointers+i) = *&arr[i];**(pointers[i]) = *&arr[i];

相同

这里的问题是指针[i]是int **并且还没有指向内存中的任何位置,所以你不能一次取消引用它,更不用说两次了。

如果你要做的是创建一个指向arr成员的指针数组,那么你的代码看起来应该更像这样。

(*pointers) = (int**)malloc(size * sizeof(int*));  
for (i = 0; i < size; i++) 
{
    (*pointers)[i] = &(arr[i]);      
}

并且因为你想将pointers返回给调用函数,你将它作为指针传递,并且必须取消引用它。