Строка «имена» исчезает после qsort со структурой «Символ»

Итак, я получаю функциональные символы ELF из файла, помещаю их в новую структуру Symbol и сортирую массив символов в алфавитном порядке по имени. Я использую strdup для выделения памяти для моей строки

перед сортировкой:

00000000 00000015 t crash_here
00000015 00000014 t winky
00000036 0000002e t dinky
00000029 0000000d T pinky
00000064 00000014 T binky
00000078 00000017 T main

после сортировки:

00000064 00000014 T 
00000000 00000015 t 
00000036 0000002e t 
00000078 00000017 T 
00000029 0000000d T 
00000015 00000014 t 

Что могло пойти не так?! Вот еще код для контекста:

FILE *fp;
fp = fopen(argv[1], "r");
if(!fp) error(1, 0, "'%s': no such file", argv[1]); //check for valid file
size_t nelems = 0; 
Symbol *symbs = (Symbol *)getFunctionSymbols(fp, &nelems);
printAllSymbols(symbs, nelems);
qsort(symbs , nelems, sizeof(Symbol)* sizeof(Symbol), compareSymbAlph);
printAllSymbols(symbs, nelems);

int compareSymbAlph(const void *a, const void *b){
 Symbol *first = (Symbol *)a;
 Symbol *second = (Symbol *)b; 
 return strcmp(first->name, second->name);
}

ИЗМЕНИТЬ

Функция qsort работает и сортирует их по алфавиту, но каким-то образом «имена» в процессе теряются.

void printSymbol(Symbol *s){
    printf("%08x %08x %c %s\n", s->addr, s->size, s->binding, s->name);
}

void printAllSymbols(Symbol *symbArray, size_t nelems){
    for(size_t i = 0; i < nelems; i++){
        Symbol *curr = symbArray + i* sizeof(Symbol); 
        printSymbol(curr); 
    }
}

typedef struct {
    char          *name;            // name of symbol 
    uintptr_t      addr;            // symbol address
    unsigned int   size;            // symbol size in bytes
    unsigned char  binding;         // binding- T for extern or t for static
} Symbol;

Я знаю, что квадратура странная, но она работает с этим! Это сложно, потому что это большой проект, и я хочу включить контекст, но не перегружать его.


person Fran C    schedule 03.03.2015    source источник
comment
Я думаю, вам нужно опубликовать более полный код, чтобы кто-нибудь мог вам помочь.   -  person Heinrich du Toit    schedule 03.03.2015
comment
Не совсем понятно, что вы спрашиваете. Функция сортировки не работает или метод printAllSymbols работает неправильно? Кроме того, вы не включили это, вы должны добавить это в свой пост.   -  person mjuarez    schedule 03.03.2015
comment
Третий аргумент qsort — это размер каждого элемента, поэтому я считаю, что он должен быть просто sizeof(Symbol); Почему ты возводишь это в квадрат?   -  person racraman    schedule 03.03.2015


Ответы (1)


Изменить вызов qsort

qsort(symbs , nelems, sizeof(Symbol)* sizeof(Symbol), compareSymbAlph);

следующий путь

qsort(symbs , nelems, sizeof(Symbol), compareSymbAlph);

Функция printAllSymbols тоже неверна

void printAllSymbols(Symbol *symbArray, size_t nelems){
    for(size_t i = 0; i < nelems; i++){
        Symbol *curr = symbArray + i* sizeof(Symbol); 
        printSymbol(curr); 
    }
}

В этом заявлении

Symbol *curr = symbArray + i* sizeof(Symbol); 

используется недопустимая арифметика указателя.

Перепишите это просто как

void printAllSymbols(Symbol *symbArray, size_t nelems){
    for(size_t i = 0; i < nelems; i++){
        Symbol *curr = symbArray + i; 
        printSymbol(curr); 
    }
}
person Vlad from Moscow    schedule 03.03.2015
comment
@Fran C Это не работает для вас, потому что я уверен, что в вашем коде есть другие ошибки. Тем не менее, вы должны исправить свой код, как я показал. - person Vlad from Moscow; 03.03.2015