当前位置: 首页 > 知识库问答 >
问题:

在所有平台的用户空间中,分配的内存地址必须为正

文德曜
2023-03-14

我想知道是否有保证内存地址是正整数,包括零,在intptr_t中使用以下c/c函数(或更多)?也许你可以帮我这样列出他们的结果或者给我一个总结,如果没有,

参考文献

  • 虚拟地址空间

共有3个答案

濮俊美
2023-03-14

我想知道是否可以保证内存地址是正整数

任何硬件工程师都会将内存地址视为正数。

但在C编程中,这毫无意义。在编程中,我们有指针,它们不是整数。它们是一些可打印的位模式(实现定义)。打印指针可以让你

FFFFFFFF00112233

你可以随心所欲地把它看作是正的或负的,但这没有意义。根据C标准,它们不是整数,因此既不是正的也不是负的。

您可以将指针转换为intptr\u tuintprt\u t。它们分别是有符号和无符号的。所以你能得到的范围取决于你想要什么。

赏彭薄
2023-03-14

在C(和C)中,整数和指针(对象的内存地址,通用形式:void*)类型之间有明显的区别。

这两种类型都是兼容类型,属于同一组,即标量类型。

类型ptrdiff_t是减去两个指针时返回的有符号整数类型。自C99/C 11以来,随着固定宽度整数类型的引入,我们还有类型intptr__tuintpr_t,能够容纳指针的整数类型。

总之,如果你说的是地址(指针),你不是在说整数类型。因为两者都是标量类型,所以它们彼此兼容,因此(在某些情况下)可以互换。但从来都不平等。因此,我认为你的问题毫无意义。

参考:

  • C型支架
  • 语言定义的基本类型
  • 固定宽度整数类型
祁权
2023-03-14

你对问题进行了一半的编辑,在某种程度上改变了它的解释。我将回答这两个版本。

我想知道是否可以保证内存地址是正整数

至少在C和C语言中,内存地址是内存地址——它不一定是整数。在这些语言中,内存地址(指针)和整数之间的转换是有问题的,它们需要显式转换,并且不能保证它们总是有效。然而,如果我们确实认为内存地址是整数,我们总是认为它们是无符号整数,这意味着它们在几乎任何平台上都不能是负的。

我想知道在intptr\u t

啊哈。完全不同的问题intptr_t是一种有符号类型,所以现在我们想知道的是,基本上,在地址空间的“上半部分”中是否有地址,这意味着它们有其高阶(最高有效)位集,这意味着如果我们将它们视为有符号类型,它们将被解释为负数?

当我第一次在16位PDP-11上学习C时,堆栈位于地址空间的顶部,从地址0xffff或-1开始,所以是的,我看到了很多“负”地址,通常是任何堆栈地址。(在那些日子里,我们没有intptr_t,但如果我们把它们当作有符号整数处理,我们确实有看起来是负数的地址。)

当Unix第一次移植到32位VAX时,从那时起,大多数/所有32位版本的Unix和Linux都使用AFAIK,用户内存被限制在虚拟内存地址空间的“下半部分”,而操作系统本身被映射到上半部分。所以在这些平台上,用户地址看起来总是正面的,我猜这就是你要问的。

我不知道Windows是如何操作的,我也不知道现代64位操作系统(如果你的操作系统设置为支持32位或64位程序,就更不用说了)上的东西通常是如何布置的。

所以我真的帮不了你填桌子。当然,不能保证用户地址在转换为intptr\t时始终为正。如果你希望得到这样的保证,如果你正在考虑编写一个利用它的程序,我强烈建议你重新考虑,如果可能的话。

(多年来,出于各种“聪明”的原因,各种“聪明”的程序试图篡夺指针变量的一位或多位,作为自己目的的标志,因为它们知道这些位碰巧对那天的实际指针地址来说微不足道。尽管这些程序可能在短期内获得了性能提升,但根据我的经验,这些技巧最终总是会失败。我会像躲避瘟疫一样躲避它们。)

 类似资料:
  • 问题内容: 我正在尝试打电话 直接,但获得EFAULT错误代码。出现此错误是因为 buf 指向内核空间中的内存。 那么,是否有可能从内核分配用户空间内存? 与 内核内存相似并返回指向内核内存的指针。 问题答案: 您可以使用以下方法临时禁用内存地址有效性检查:

  • 问题内容: 我的问题是关于将数据从内核传递到用户空间程序。我想实现一个系统调用“ get_data(size,char * buff,char ** meta_buf)”。在此调用中,buff由用户空间程序分配,并且其长度在size参数中传递。但是,meta_buf是可变长度的缓冲区,已分配(在用户空间程序的vm页面中)并由内核填充。用户空间程序将释放该区域。 (我无法在用户空间中分配数据,因为用

  • 问题内容: 有没有办法从linux中的用户空间分配连续的物理内存?至少有几个保证的连续内存页。一个巨大的页面不是答案。 问题答案: 不,那里没有。您 确实 需要在内核空间中执行此操作。 如果您说“我们需要从用户空间执行此操作”-没有在内核空间中进行任何操作,那没有什么意义-因为用户空间程序无法控制 甚至不知道 底层内存是否连续。 您需要执行此操作的唯一原因-是与某个硬件或其他需要此要求的低层(即内

  • 地址空间 分段机制涉及5个关键内容:逻辑地址(Logical Address,应用程序员看到的地址,在操作系统原理上称为虚拟地址,以后提到虚拟地址就是指逻辑地址)、物理地址(Physical Address, 实际的物理内存地址)、段描述符表(包含多个段描述符的“数组”)、段描述符(描述段的属性,及段描述符表这个“数组”中的“数组元素”)、段选择子(即段寄存器中的值,用于定位段描述符表中段描述符表

  • 问题内容: 我的应用程序中有一堆缓冲区(其中25到30个),它们很大(.5mb),可以同时访问simulataneousley。更糟糕的是,它们中的数据通常只读取一次,并且经常更新(例如每秒30次)。某种非最佳缓存使用的完美风暴。 无论如何,我想到,如果我可以将内存块标记为不可缓存,那将是很酷的……从理论上讲,这将为其他所有内容在缓存中留出更多空间。 那么,他们是否有办法获得在Linux中标记为不

  • 我有来自Microsoft Azure数据中心(http://www.microsoft.com/en-us/download/confirmation.aspx?id=41653)的900个IP地址范围,我想知道IP地址是否来自其中一个地址。我已经把它转换成一个列表,可以存储在文本文件中。 所以:循环遍历每个地址并使用ip2long()如这里的第3点是否成本更高(https://mebsd.co