结构包含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。
问题:
无法使用显示的代码进行复制。尽管存在一些问题(如
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);
}