所以我在学校得到了一个包含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。
如果存在此异常的处理程序,则程序可能是安全的 继续
我承认该程序不完整,并且可能存在与我所遇到的错误无关的方式存在缺陷。请关注与访问冲突错误相关的问题。
答案 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
返回给调用函数,你将它作为指针传递,并且必须取消引用它。