[英]EXC_BAD_ACCESS using QSort on an Array of Chars within Structs in C
我在這里搜索了很多答案,並在此基礎上進行了一些更改,但是在調用qsort函數時遇到EXC_BAD_ACCESS錯誤。 我的IDE指向我的qsort比較函數中的返回問題。 我知道我正在為所有元素正確分配內存,因為如果我省略對qsort的調用,我可以毫無問題地打印字符串。 有人可以指出我正確的方向嗎?
我的結構,以了解我導航的深度:
typedef struct {
unsigned int siteId;
unsigned int tableTypeId;
unsigned int surMatId;
unsigned int strucMatId;
char *streetAve;
unsigned int neighbourhoodId;
char *neighbourhoodName;
unsigned int ward;
char *latitude;
char *longitude;
} Entries;
typedef struct {
int size;
Entries **entry;
} PicnicTable;
typedef struct {
Table *tableTypeTable;
Table *surfaceMaterialTable;
Table *structuralMaterialTable;
NeighbourHoodTable *neighborhoodTable;
PicnicTable *picnicTableTable;
} DataBase;
extern DataBase *DB;
Entries **ent = DB->picnicTableTable->entry;
qsort(ent,DB->picnicTableTable->size-1, sizeof(Entries*), cmpfunc); typedef struct {
unsigned int siteId;
unsigned int tableTypeId;
unsigned int surMatId;
unsigned int strucMatId;
char *streetAve;
unsigned int neighbourhoodId;
char *neighbourhoodName;
unsigned int ward;
char *latitude;
char *longitude;
} Entries;
typedef struct {
int size;
Entries **entry;
} PicnicTable;
typedef struct {
Table *tableTypeTable;
Table *surfaceMaterialTable;
Table *structuralMaterialTable;
NeighbourHoodTable *neighborhoodTable;
PicnicTable *picnicTableTable;
} DataBase;
extern DataBase *DB;
呼叫看起來像這樣:
Entries **ent = DB->picnicTableTable->entry;
qsort(ent,DB->picnicTableTable->size-1, sizeof(Entries*), cmpfunc);
比較功能是:
int cmpfunc(const void *a, const void *b) {
Entries *left = *(Entries**)a;
Entries *right = *(Entries**)b;
return strcmp(left->neighbourhoodName, right->neighbourhoodName);
}
在此malloc之后初始化picnicTableTable和Entry:
DB->picnicTableTable = malloc(sizeof(PicnicTable));
DB->picnicTableTable->entry = malloc(numEntries*sizeof(Entries)+1);
DB->picnicTableTable->size = numEntries;
while ((c=fgetc(IN)) != EOF) {
if (c == ',' && row > 0) {
switch (column) {
case 0: neighbourhoodName = copyToChar(buff, begin, i);
...
}
copyToChar占用緩沖區的一部分,並分配內存,然后返回一個指向我分配的值的指針:
char * copyToChar(const char * buff, int begin, int end) {
char *temp = malloc(end - begin + 1);
int j = 0;
for (int i = begin; i < end; i++, j++)
temp[j] = buff[i];
temp[j] = '\0';
return temp;
}
在我遍歷文件的每一行后填充數組(這只是一個條目):
DB->picnicTableTable->entry[row]->neighbourhoodName = malloc(strlen(neighbourhoodName)*sizeof(char)+1);
a-> neighbourhoodName的值為NULL,這使我感到困惑。 qsort不會將數組中的兩個值傳遞給compare函數嗎?
謝謝你的時間!
謹防。 您聲明entry為指向指針的指針(指向指針數組的第一個元素)
typedef struct {
int size;
Entries **entry;
} PicnicTable;
但將其初始化為純動態數組,即指向以下項中的Entrys
數組的第一個元素的指針:
DB->picnicTableTable->entry = malloc(numEntries*sizeof(Entries)+1);
如果要使用指針數組來加快qsort的速度,則應單獨構建它:
typedef struct {
int size;
Entries *entry;
Entries **pentry;
} PicnicTable;
DB->picnicTableTable->entry = malloc(numEntries*sizeof(Entries)+1);
DB->picnicTableTable->pentry = malloc(numEntries*sizeof(&Entries)+1);
for (int i=0; i<=numEntries; i++) { // initialize the array of pointers
pentry[i] = entry + i;
}
當前, cmpfunc
的定義與您對DB->picnicTableTable->entry
初始化DB->picnicTableTable->entry
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.