Строка 'names' исчезает после qsort со структурой 'Symbol'

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

до qsort:

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

после qsort:

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;

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

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); 
    }
}
Другие вопросы по тегам