对指针数组进行排序

2024-03-01

我是否正确地认为,为了对指针数组进行排序,将指针视为 int 是可以的,例如

qsort(ptrs, n, sizeof(void*), int_cmp);

我想对 ptr 进行排序以确定是否存在重复项,而不管指针指向的类型是什么,因此 qsort 是执行此操作的先驱。

my int_cmp()是相当标准的,例如

int int_cmp(const void *a, const void *b)
{
    const int *ia = (const int *)a; // casting pointer types
    const int *ib = (const int *)b;

    /* integer comparison: returns negative if b > a
    and positive if a > b */
    return *ia  - *ib;
}

它似乎在我的单元测试中起作用,但是是否有某种原因将 ptr 视为 int 可能会导致我可能忽略的这种情况出现问题?


不,你根本不对,除非你want按地址对指针进行排序。不过,实际地址很少有任何意义,所以这种可能性很小。

为了检测重复的指针,您应该只比较指针,这是明确定义的。

我可能会使用一个解决方案uintptr_t:

static int order_pointers(const void *pa, const void *pb)
{
  const uintptr_t a = *(void **) pa, b = *(void **) pb;

  return a < b ? -1 : a > b;
}

还没有测试过这个,但类似的东西应该有效。

转换为uintptr_t是必要的,因为您无法有效地比较随机指针。我引用 C99 标准草案,§6.5.8.5:

比较两个指针时,结果取决于指针中的相对位置 所指向对象的地址空间。如果两个指向对象或不完整类型的指针都 指向同一个对象,或者都指向同一数组对象的最后一个元素, 他们比较平等。如果指向的对象是同一个聚合对象的成员, 稍后声明的指向结构成员的指针比较大于指向成员的指针 在结构体的前面声明,并指向具有较大下标的数组元素 值比较大于指向同一数组中具有下标的元素的指针 价值观。指向同一联合对象成员的所有指针比较相等。如果 表达式 P 指向数组对象的元素,表达式 Q 指向 同一数组对象的最后一个元素,指针表达式 Q+1 比较大于 P。在所有其他情况下,行为是未定义的。

我将最后一句加粗,因为这就是这里适用的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对指针数组进行排序 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • CriteriaBuilder:使用 ON 子句连接一对多

    假设您有以下 OneToMany 关系 School gt Student gt ScientificWork 现在您想要选择所有学生名为 John 且他的科学工作称为 黑洞 的学校 我按照以下方式进行操作 但由于某种原因它返回了我所有可能
  • primefaces 数据表列过滤框中不显示下拉列表

    我正在使用 Jsf 2 2 和 primefaces 4 0 当我使用此代码时一切正常
  • 与 java 一起使用的最佳数学库是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 组合两个相等链表的转轮技术

    所以 我在这里面临着一个疑问 我正在读 破解编码面试 一书 那里写着下面的文字 假设你有一个链表a1 gt a2 gt an gt b1 gt b2 bn 并且您想将其重新排列为a1 gt b1 gt a2 gt b2 gt an gt b
  • 如何删除mongodb中的深层嵌套对象

    假设我有一个代表这样的书籍的文档 id 1234567890 title Lord Of The Rings books 1234567890 id 123456789890 title The Two Towers page count
  • 如何更改 wcf 客户端中的时间戳安全标头?

    我正在尝试修改安全标头的默认过期时间 即 5 分钟到 1 分钟 服务器的安全策略之一是时间戳 请求的日期 生存时间为一分钟 任何想法 我尝试创建自定义绑定但没有成功
  • ActiveAdmin 中的格式提示问题(不需要的对象 ID 输出)

    当我使用 formattastic DSL 进行 ActiveAdmin 编辑表单时 我得到以下输出 0x00000006bd1018 gt 图片标签 gt 为什么这从 obj inspect 的结果开始以及如何删除这部分 导致此错误的代码
  • 如何正确使用范围 https://www.googleapis.com/auth/drive.file

    我尝试使用以下代码访问我的 Google 云端硬盘中的 Google 表格文件 import gspread from oauth2client service account import ServiceAccountCredential
  • 我的 UITableViewController 中的内存泄漏在哪里?

    表视图工作正常 但是当我离开视图并第二次返回时 出现内存泄漏 可能 viewDidLoad 中的某些内容不确定 我正在运行泄漏工具并收到以下通知 Leaked Object Address Size Responsible Library
  • 在PyQt中,如何将终端嵌入到窗口中?

    我有一个小脚本 旨在将 xterm 嵌入 PyQt GUI 中 在 Linux 上 它可以工作 创建一个如下所示的 GUI 然而 在 OS X 上运行相同的脚本会产生两个如下所示的窗口 有谁知道如何解决这个问题并防止 OS X 搞砸 GUI
  • 我应该将变量保留为瞬态吗?

    我一直在尝试使用 Apache Spark 来解决一些查询 例如 top k skyline 等 我做了一个包装纸 其中包含SparkConf and JavaSparkContext named SparkContext 这个类也实现了可
  • 将标准输入和标准输出重定向到文件

    我目前是一个学校的助教C语言简介班级 该课程是使用 Visual Studio 进行教学的 但是在评分时 我只使用一个简单的 Windows 批处理脚本来处理所有提交的作业 编译它们 在测试文件上运行它们 并将输出重定向到我可以打印的一系列
  • ListView获取滚动位置?

    我正在使用 MergeAdapter 来自 Mark Murphy 的优秀项目系列 您可以将它与 ListView 一起使用 我试图在刷新时重建适配器的内容 而不是 就地 刷新并调用notifyDataSetChange 我想获取列表视图的
  • 在 R data.table 中,如何将变量参数传递给表达式?

    我遇到了一个 R 小问题data table 非常感谢您的帮助 我该怎么做呢 getResult lt function dt expr gby e lt substitute expr b lt substitute gby return
  • 使用 Excel VBA 重命名文件

    这就是我需要做的 我在 Excel 工作表中有这两列 带文件名 第一列包含当前文件名 第二列包含我想要将文件重命名为的名称 我需要使用它 因为重命名没有模式 例如 下面可能是一组文件 Current Name gt Rename To Ab
  • Scala中如何从内部类引用外部对象

    考虑这段代码 这是一种类型安全单元 abstract class UnitsZone type ConcreteUnit lt AbstractUnit abstract class AbstractUnit val qty Int SOM
  • simplexml_load_file 不起作用

    我下面有这段代码 它在我的远程托管服务器上运行良好 但由于某种原因不能在我的本地 Linux 机器上运行 我也尝试使用 file get contents 来获得宁静的服务 但它也返回 false 有谁知道为什么会发生这种情况 谢谢 xml
  • 使用“devtools::install_github”和克隆 GitHub 存储库有什么区别?

    I used devtools install github 在 R 中安装存储库 并使用以下命令安装了存储库git clone在终端 这两条路线有什么区别 到目前为止 我明白我可以使用library package 在 R 中 并将加载该
  • Angular 5中如何从父组件继承子组件中的CSS样式

    我有一个父组件 其中有一个子组件 父组件有一些 css 类 子组件扩展了它们 我尝试使用 host 查看文档 但似乎无法使其正常工作 子组件 div class table row body div class table cell bod
  • 对指针数组进行排序

    我是否正确地认为 为了对指针数组进行排序 将指针视为 int 是可以的 例如 qsort ptrs n sizeof void int cmp 我想对 ptr 进行排序以确定是否存在重复项 而不管指针指向的类型是什么 因此 qsort 是执