C ';名称';字符串在使用'进行qsort后消失;符号';结构

C ';名称';字符串在使用'进行qsort后消失;符号';结构,c,struct,elf,qsort,sortcomparefunction,C,Struct,Elf,Qsort,Sortcomparefunction,因此,我从一个文件中获取ELF函数符号,将它们放入一个新的符号结构中,并按名称的字母顺序对符号数组进行排序。我使用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之后

因此,我从一个文件中获取ELF函数符号,将它们放入一个新的符号结构中,并按名称的字母顺序对符号数组进行排序。我使用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;
无效打印符号(符号*s){
printf(“%08x%08x%c%s\n”,s->addr,s->size,s->binding,s->name);
}
无效打印所有符号(符号*符号栏,尺寸){
对于(大小i=0;i

我知道平方是奇怪的,但它的工作与此!这很难,因为这是一个大项目,我想包括背景,但不是压倒性的

更改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); 
    }
}
使用了无效的指针算法

重写它就像

void printAllSymbols(Symbol *symbArray, size_t nelems){
    for(size_t i = 0; i < nelems; i++){
        Symbol *curr = symbArray + i; 
        printSymbol(curr); 
    }
}
void printAllSymbols(Symbol*symbary,size\u t nelems){
对于(大小i=0;i
我认为您需要发布更完整的代码,以供任何人帮助。您的要求并不完全清楚。排序功能是否不起作用,或者
printalsymbols
方法是否工作不正常?另外,你没有包括它,你应该将它添加到你的帖子中;你为什么要摆平它?@Fran C它对你不起作用,因为我确信你的代码中还有其他错误。尽管如此,您还是应该如我所示更正代码。
void printAllSymbols(Symbol *symbArray, size_t nelems){
    for(size_t i = 0; i < nelems; i++){
        Symbol *curr = symbArray + i; 
        printSymbol(curr); 
    }
}