结构包含char的qsort()存在问题*

结构包含char的qsort()存在问题*,c,qsort,C,Qsort,表.h: #ifndef table_h #define table_h // The object: typedef struct Pair { char* name; int number; } Pair; int comp_pair(const void* lhs, const void* rhs) { Pair* lp = (Pair*) lhs; Pair* rp = (Pair*) rhs; const char* ln = lp

表.h

#ifndef table_h
#define table_h   

//  The object:
typedef struct Pair
{
    char* name;
    int number;
} Pair;

int comp_pair(const void* lhs, const void* rhs)
{
    Pair* lp = (Pair*) lhs;
    Pair* rp = (Pair*) rhs;

    const char* ln = lp->name;
    const char* rn = rp->name;

    return strcmp(ln, rn);
}

// The array and associated functions:
size_t table_capacity;                                           
size_t table_size;                                               
Pair* table;            // <------ Global variables -------------------

Pair* create_table (size_t capacity)
{
    Pair* p = 0;
    p = (Pair*) malloc(sizeof(*p) * capacity);

    if (p == NULL && capacity > 0)
    {
        perror("create_table()::bad allocation!\n");
        exit(-1);
    }

    table_capacity = capacity;

    return p;
}    

void insert (Pair* table, const char* name, int number)
{
    Pair* p = (Pair*) malloc(sizeof(*p));

    if (p == NULL)
    {
        perror("insert::bad allocation!\n");
        exit(-1);
    }

    p->name = name;
    p->number = number;

    table[table_size++] = *p;
}

void print_table(Pair p[], size_t size)
{
    size_t i = 0;
    for (i; i < size; ++i)
    {
        printf("%s -> %d\n", p[i].name, p[i].number);
    }
}

#endif
当我尝试使用
qsort()
时,(调试)上述代码会生成以下错误:

访问冲突读取位置0x65727541。

问题:

  • 函数comp_pair()正确吗
  • 我应该在qsort()中传递什么大小作为第三个参数,当前的sizeof(Pair)或实际比较类型的大小,即char*

  • 无法使用显示的代码进行复制。尽管存在一些问题(如
    const
    正确性、
    insert()
    中的内存泄漏,以及带有作为实例返回的内容大小的全局值的可疑设计),但代码应该按预期工作。是否缺少一些代码?这不是真正的问题,但在
    insert
    中有meory泄漏。分配对,初始化它,将内容复制到表中,然后忘记释放它。你不需要malloc,你可以使用下一个表索引来初始化指针。除了insert()函数中的内存泄漏外,你在这里发布的代码看起来不错,只要你有合适的
    #include
    s问题在于其他方面,确保你的实际代码与你在这里发布的代码匹配。尽管有一些小错误,此处显示的代码不应崩溃。您正在使用哪个编译器(+版本)以及在哪个平台上?链接了哪个标准C库(+版本)?编译期间使用哪些标志?如果这真的是你所有的代码,那么编译器或运行时可能有问题。@Ziezi那么你正在运行一个旧的可执行文件,它不是编译这段代码的结果。如果您创建了一个新的解决方案/项目,请将代码从这里复制粘贴到2个新文件main.c和table.h中,生成并运行该代码,您不会得到您报告的崩溃。无法使用显示的代码进行复制。尽管存在一些问题(如
    const
    正确性、
    insert()
    中的内存泄漏,以及带有作为实例返回的内容大小的全局值的可疑设计),但代码应该按预期工作。是否缺少一些代码?这不是真正的问题,但在
    insert
    中有meory泄漏。分配对,初始化它,将内容复制到表中,然后忘记释放它。你不需要malloc,你可以使用下一个表索引来初始化指针。除了insert()函数中的内存泄漏外,你在这里发布的代码看起来不错,只要你有合适的
    #include
    s问题在于其他方面,确保你的实际代码与你在这里发布的代码匹配。尽管有一些小错误,此处显示的代码不应崩溃。您正在使用哪个编译器(+版本)以及在哪个平台上?链接了哪个标准C库(+版本)?编译期间使用哪些标志?如果这真的是你所有的代码,那么编译器或运行时可能有问题。@Ziezi那么你正在运行一个旧的可执行文件,它不是编译这段代码的结果。如果您创建了一个新的解决方案/项目,请将代码从这里复制粘贴到两个新文件main.c和table.h中,生成并运行该代码,您不会得到您报告的崩溃。
    #include <stdio.h>
    #include <stdlib.h>     // qsort() 
    #include <string.h>     // strcmp()
    #include <stddef.h>     // size_t
    #include "table.h"
    
    int main()
    {
        char* names [ ] = { "bla1", "bla2", "bla3", "bla4", "bla5"};
        int numbers [ ] = { 1, 2, 3, 4, 5 };
        size_t s = 5;
        size_t i = 0;
    
        table = create_table(s);
    
        for (i; i < s; ++i)
        {
            insert(table, names[i], numbers[i]);    
        }
    
        qsort(table, table_size, sizeof(Pair), comp_pair);
    
        print_table(table, table_size);
        getchar();
    
        free(table);
    }