EXC_BAD_ACCESS 在用于基数排序的链表中的指针上
Posted
技术标签:
【中文标题】EXC_BAD_ACCESS 在用于基数排序的链表中的指针上【英文标题】:EXC_BAD_ACCESS on pointer in linked list for radix sort 【发布时间】:2013-08-01 20:33:28 【问题描述】:我正在尝试提出一种基本的基数排序(我从未真正见过,所以如果我的很糟糕,我很抱歉),但我在link = *(link.pointer);
线上收到了一个EXC_BAD_ACCESS
错误.我的C
技能不是很好,所以希望有人能教我我做错了什么。
我正在使用 XCode 并且启用了 ARC。
代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define ARRAY_COUNT 10
#define MAX_VALUE 1000000
#define MODULO 10.0f
typedef enum
false,
true
bool;
typedef struct linkedListStruct
int value;
struct linkedListStruct *pointer;
LinkedList;
void radixSort(int *array);
bool arraySorted(int *array);
int * intArray(int minValue, int maxValue);
int main(int argc, const char * argv[])
int *sortingArray = intArray(0, MAX_VALUE);
radixSort(sortingArray);
printf("Array %s sorted", arraySorted(sortingArray) ? "" : "not");
return 0;
void radixSort(int *array)
int numberOfIterations = (int)ceilf(log(MAX_VALUE)/log(MODULO));
for(int n = 0; n < numberOfIterations; n++)
LinkedList *linkedListPointers[(int)MODULO] = 0;
int i = ARRAY_COUNT;
while(i--)
int location = (int)floor((array[i] % (int)powf(MODULO, n + 1))/powf(MODULO, n));
LinkedList link = array[i], NULL ;
link.pointer = linkedListPointers[location];
linkedListPointers[location] = &link;
int location = 0;
for(int pointerSelection = 0; pointerSelection < MODULO; pointerSelection++)
if(linkedListPointers[pointerSelection])
LinkedList link = 0, linkedListPointers[pointerSelection] ;
linkedListPointers[pointerSelection] = NULL;
while(link.pointer)
link = *(link.pointer);
array[location++] = link.value;
bool arraySorted(int *array)
int i = ARRAY_COUNT;
while(--i)if(array[i - 1] > array[i])break;
return !i;
int * intArray(int minValue, int maxValue)
int difference = maxValue - minValue;
int *array = (int *)malloc(sizeof(int) * ARRAY_COUNT);
int i;
for(i = 0; i < ARRAY_COUNT; i++)
array[i] = rand()%difference + minValue;
return array;
另外,如果有人想对我的排序提出改进建议,我也将不胜感激。
【问题讨论】:
嗯,为什么你有一个带有 bool 的枚举,bool 已经是一个定义的类型和语言的一部分,就像 int、short 等一样。 @claptrap 我并不总是使用C99
进行编译,所以这更像是一种习惯。即使现在我还在使用 GNU99。
关于@claptrap的评论,可以#include <stdbool.h>
得到bool
类型(我相信是_Bool
的typedef)。
@jxh 我认为这是 C99
按照 this answer 独有的。
既然你用的是xcode,gdb调试器说什么?
【参考方案1】:
问题来自我如何分配链表。我变了
LinkedList link = array[i], NULL ;
link.pointer = linkedListPointers[location];
到
LinkedList *link = malloc(sizeof(LinkedList));
link->value = array[i];
link->pointer = linkedListPointers[location];
在第一个示例中,指向link
的指针在每次循环迭代中都保持不变(我不知道它会这样做),因此我需要使指针指向新分配的内存块。
编辑:
改变也让我改变
while(link.pointer)
link = *(link.pointer);
array[location++] = link.value;
到
while(linkPointer)
link = *linkPointer;
array[location++] = link.value;
linkPointer = link.pointer;
【讨论】:
需要初始化LinkedList *linkedListPointers[(int)MODULO]=0;
@BLUEPIXY 不错。我的代码中有这个,但我忘了提到我也改变了它。谢谢!以上是关于EXC_BAD_ACCESS 在用于基数排序的链表中的指针上的主要内容,如果未能解决你的问题,请参考以下文章