- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于 int *a, int *b
,a == b
是否意味着 (intptr_t)a == (intptr_t)b
?我知道例如在现代 X86 CPU 上确实如此,但是 C 标准或 POSIX 或任何其他标准是否对此提供保证?
最佳答案
C 标准不保证这一点。 (此答案未说明 POSIX 或其他标准是否对 intptr_t
进行了说明。)C 标准(2011 年,N1570 草案)对 intptr_t
的说明是:
7.20.1.4 1 The following type designates a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer: intptr_t
作为一个理论证明,一个反例是一个具有 24 位地址的系统,其中高八位未被使用,但可用的整数类型有 8 位、16 位和 32 位。在这种情况下,C 实现可以使 intptr_t
成为 32 位整数,并且可以通过将 24 位地址复制到 32 位地址来将指针转换为 intptr_t
整数并忽略高八位。这些位可能是以前存在的任何东西遗留下来的。当 intptr_t
值转换回指针时,编译器会丢弃高八位,从而得到原始地址。在这个系统中,当 a == b
被评估为指针 a
和 b
时,编译器通过只比较 24 位的地址。因此,如果 a
和 b
指向同一个对象 a == b
将为真,但是 (intptr_t) a == (intptr_t) b
由于忽略了高位,因此可能评估为 false。 (请注意,严格来说,a
和 b
应该是指向 void
的指针,或者应该转换为指向 void
的指针在转换为 intptr_t
之前。)
另一个例子是使用一些基址和偏移寻址的系统。在这个系统中,一个指针可能由指定一些基地址的 16 位和指定偏移量的 16 位组成。 base 可能是 64 字节的倍数,所以 base 和 offset 表示的实际地址是 base•64 + offset。在这个系统中,如果指针 a
的基数为 2,偏移量为 10,则它表示的地址与指针 b
的基数为 1,偏移量为 74 相同。当比较指针时,编译器会为每个指针评估 base•64 + offset 并比较结果,因此 a == b
评估为 true。但是,当转换为 intptr_t
时,编译器可能会简单地复制这些位,从而为 (intptr_t) a
生成 131,082 (2•65536 + 10) 和 65,610 (1•65536 + 74) 用于 (intptr_t) b
。然后 (intptr_t) a == (intptr_t) b
的计算结果为 false。但是,将 intptr_t
转换回指针类型会产生原始指针的规则仍然成立,因为编译器将简单地再次复制这些位。
关于c - 指针相等是否意味着整数相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50726231/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
指针, C语言的精髓 莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA). 什么是指针 保存变量地址的变量叫做指针. 这是大概的定义, 但是Defad认为
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我是一名优秀的程序员,十分优秀!