首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C:使用qsort对指向ADT (struct)的指针数组进行排序。

C:使用qsort对指向ADT (struct)的指针数组进行排序。
EN

Stack Overflow用户
提问于 2015-09-16 13:15:06
回答 2查看 160关注 0票数 1

我一直试图使用qsort()对ADT (名为SSET)的指针数组进行排序,但我得到了一个奇怪的结果。这是我的功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extern void sset_sort_sets(SSET *sets[], int n) {
    qsort(sets, n, sizeof(SSET *), sset_cmp);
}

sset_cmp()中,我放置了一个语句来打印它正在比较的SSET

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int sset_cmp(const void *a, const void *b){
    SSET *pa = (SSET *) a;
    SSET *pb = (SSET *) b;

    printf("sset_cmp called:\n");
    printf("  a = "); sset_display(pa);
    printf("  b = "); sset_display(pb);
    printf("\n");

    // More stuff...

我创建了一个由两个SSET组成的数组(在main()中)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SSET *s[2];
int a[] = {-4, 0, 3, 3, 22};
int c[] = { 1, 2, 3, 4, 5};
s[0] = sset_from_array(c, n); // { 1 2 3 4 5 }
s[1] = sset_from_array(a, n); // { -4 0 3 22 }

int i;
printf("Before sort:\n");
for (i = 0; i < 2; i++)
    sset_display(s[i]);
printf("\n");

sset_sort_sets(s, 2);

printf("After sort\n");
for (i = 0; i < 2; i++)
    sset_display(s[i]);

但我在输出中得到的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Before sort:
  { 1 2 3 4 5 }
  { -4 0 3 22 }

sset_cmp called:
  a =   { -1589621936 -4 0 3 22 }
  b =   { -1589621568 }

After sort
  { 1 2 3 4 5 }
  { -4 0 3 22 }

我想我在给qsort()打电话时搞砸了一些提示,但我不知道怎么做。

我想我把所有相关代码都包括进去了。告诉我如果还有其他片段你需要找出我的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-16 13:24:09

qsort()将指向数组元素的指针传递给比较函数。因此,如果您有一个int数组,则比较函数将接收int *

您正在尝试对指向SSET的指针数组进行排序,即SSET *数组。因此,比较函数将接收指向SSET (so,SSET **)的指针。

所以你需要改变这个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SSET *pa = (SSET *) a;
SSET *pb = (SSET *) b;

至:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SSET *pa = *(SSET **) a;
SSET *pb = *(SSET **) b;

另外,不将类型名称硬编码为sizeof的操作数通常是个好主意。如果类型发生变化,这将是您将来必须更新的另一个地方,您可能会犯错误,因为您必须记住使用正确的类型。

考虑更改这一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qsort(sets, n, sizeof(SSET *), sset_cmp);

至:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qsort(sets, n, sizeof(sets[0]), sset_cmp);
票数 1
EN

Stack Overflow用户

发布于 2015-09-16 13:23:30

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SSET *pa = (SSET *) a;

看上去不对。qsort将指向元素的指针传递给比较函数。数组元素是指针,因此比较函数接收指向指针的指针:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SSET *pa = *(SSET **)a;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32618857

复制
相关文章
函数指针,使用qsort,进行结构体排序
我们创建了一个学生信息结构,结构成员包括名字,学号和成绩。main函数中创建了一个包含三个学生信息的数组,并使用qsort函数对数组按照学生成绩进行排序。qsort函数第四个参数是函数指针,因此我们需要传入一个函数指针,并且这个函数指针的入参是cont void *类型,返回值为int。我们通过前面的学习知道了函数名本身就是指针,因此只需要将我们自己实现的studentCompare作为参数传入即可。
用户4645519
2020/09/08
1.7K0
C语言 | 指向指针的指针排序
这道理放在C语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是日积月累的学习。
小林C语言
2021/03/10
1.8K0
C++指向数组元素的指针
在C++中,一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址;指针变量既然可以指向变量,也可以指向数组元素,所谓数组元素的指针就是数组元素的地址。
小林C语言
2020/12/15
2.2K0
C++指向数组元素的指针
指针数组与指向指针的指针
指针数组与指向指针的指针 http://wlkc.gdqy.edu.cn/jpkc/portal/blob?key=173314 指针数组和数组指针的区别 http://allew.blog.163.
阳光岛主
2019/02/19
1.9K0
C语言 | 用指向指针的指针对n个整数排序
例82:C语言用指向指针的指针的方法对n个整数排序并输出;要求将排序单独写成一个函数;n个整数在主函数中输入,最后在主函数中输出。
小林C语言
2021/02/12
1.5K0
C语言 | 用指向指针的指针对n个整数排序
C语言 | 指向指针的指针
这道理放在C语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是日积月累的学习。
小林C语言
2021/03/10
3K0
使用 Python 对波形中的数组进行排序
假设我们采用了一个未排序的输入数组。我们现在将对波形中的输入数组进行排序。数组 'arr[0..n-1]' 以波形排序,如果 arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= .....
很酷的站长
2023/02/22
6.9K0
使用 Python 对波形中的数组进行排序
c语言之指向指针的指针
定义:int **p; 实例: #include<stdio.h> #include<iostream> int main() { char* str[] = { "hello","hi","nihao" }; char** p; for (int i = 0; i < 3; i++) { //指针指向数组中的第几个指针 p = str + i; //想要获得指针指向的值,通过*来解引用 printf("%s\n", *p
西西嘛呦
2020/08/26
1.5K0
C++ 中关于指向数组的指针与指针数组的一些思考
在 C++ 中,可以将一个指针指向某个数组,也可以使用一个指针数组指向一个数组。这二种方式的具体使用请看以下代码:
耕耘实录
2022/05/09
1.4K0
c++常量指针和指针常量_指针指向二维数组
a)常量定义:不可修改的值,例如250,’A’ b)const关键字功能:将变量常量化,四种形式
全栈程序员站长
2022/09/27
7450
c++常量指针和指针常量_指针指向二维数组
使用asort函数对PHP数组进行升序排序
PHP是一门功能强大的语言,数组是PHP中十分常用的数据结构之一。在实际开发中,经常需要对数组进行排序。PHP提供了多个函数用于对数组进行排序,其中asort函数可以实现对数组进行升序排序。
很酷的站长
2023/08/25
4960
使用asort函数对PHP数组进行升序排序
c语言之使用指针将数组进行反转
#include<stdio.h> #include<iostream> void reverse(int* a, int length) { int* p, temp, * i, * j, m; m = (length - 1) / 2;//取得中间的下标 i = a;//i指向数组的首元素 j = a + length - 1;//j指向数组的尾元素 p = a + m;//p指向数组中间的元素 for(; i < p; i++,j--) {//
西西嘛呦
2020/08/26
1.8K0
c语言之使用指针将数组进行反转
C语言实例:利用指向指针的指针实现字符串排序
实例代码 // // Created by 冲哥 on 2021/12/20. // #include<stdio.h> #include<string.h> int main() { char *str[]={"CAR","AND","FOR","ERR","DOG","BOX"},**p,*temp; int n=sizeof(str)/sizeof(str[0]),i,j,k;//计算长度 p=str; for(i=0;i<n-1;i++)//按从小到大排序,选择排
C语言中文社区
2022/05/30
7960
C语言实例:利用指向指针的指针实现字符串排序
使用指向函数的指针
/**输入2个整数,然后让用户选择1或2,选1时调用max函数,输出2者中的大数, 选2时调用min函数,输出2者中的小数**/ #include <stdio.h> #include <stdlib.h> int main() { int max(int x,int y); int min(int x,int y); int (*p)(int ,int ); int n,a,b; scanf("%d%d",&a,&b); scanf("%d",&n);
谙忆
2021/01/19
8080
【C 语言】数组 ( 数组指针 | 数组指针定义 | 使用 数组指针类型 定义数组指针 )
最后 , 声明一个 数组指针类型 变量 , 将 array2 变量地址赋值给该 数组指针类型 变量 , 指针指向的数据类型为 int[3] 数组类型的变量 array2 ;
韩曙亮
2023/03/29
3K0
【C 语言】数组 ( 数组指针 | 数组指针定义 | 使用 数组指针类型 定义数组指针 )
【C】指针进阶
这里需要注意,常量字符串“abcdef”时存放在只读数据区中的,可以读取,但不能更改,所以我们使用const来修饰,防止通过p修改字符串 const char ps = “abcdef”;//这里的ps指向的是字符串的首字符 要想修改字符串中的内容需要用到数组:
阿伟@t
2023/10/10
2000
【C】指针进阶
C++指向函数的指针
函数指针是指向函数而非指向对象的指针。与其他类型的指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。(类似C#中的代理)
卡尔曼和玻尔兹曼谁曼
2019/01/25
1.5K0
【C指针进阶】(C精髓)——对指针的更进一步深入剖析(图文近2w详解)
本文承接了上文:初阶指针——全面了解指针,在此基础上对指针进行更深一步的剖析,相信我,也请相信你自己!
诺诺的包包
2023/02/17
5820
【C指针进阶】(C精髓)——对指针的更进一步深入剖析(图文近2w详解)
【C 语言】数组 ( 数组指针 | 数组指针定义 | 使用 数组类型* 定义数组指针 )
最后 , 声明一个指针 , 将 array2 变量地址赋值给该指针 , 指针指向的数据类型为 int[3] 数组类型的变量 array2 ;
韩曙亮
2023/03/29
3.4K0
【C 语言】数组 ( 数组指针 | 数组指针定义 | 使用 数组类型* 定义数组指针 )
C语言进阶-回调函数
目录 前言 回调函数 回调型计算器 回调冒泡排序(模拟qsort库函数) qsort函数原型 compar参数 代码演示  冒泡排序(bubble_sort) ---- 前言 ---- 本文主要讲解 回调函数的理解 回调实现计算器 qsort各种功能的使用 冒泡排序各种功能的实现 回调函数 ---- 定义 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针(地址)作为参数传递给另一 个函数, 当这个指针被用来调用其所指向的函数时,我们就说这是回调函数 回调函数不是由该函数的实现
用户9645905
2022/11/30
9530
C语言进阶-回调函数

相似问题

用qsort或备用交换方法对指向struct对象的指针数组进行排序的C语言排序算法

23

对指向结构的指针数组进行排序的stdlib qsort

12

使用qsort对结构指针数组进行排序

32

对指向Objective-C对象的指针数组进行qsort

21

struct -使用qsort对c字符串进行排序

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文