簡體   English   中英

EXC_BAD_ACCESS在C的結構內的字符數組上使用QSort

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM