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

“指针来自整数/整数来自指针而不强制转换”问题

阴焱
2023-03-14
int* p = 0x12345678;

类似地,这段代码给出了“initialization make integer from pointer with a cast”:

int* p = ...;
int i =  p;

如果我在变量声明的行外做同样的操作,那么消息是一样的,但说的是“赋值”而不是“初始化”:

p = 0x12345678; // "assignment makes pointer from integer without a cast"
i = p;          // "assignment makes integer from pointer without a cast"

使用其他流行编译器进行的测试也会给出错误/警告消息:

    null
int* p = 0;

为什么不呢?

共有1个答案

黄飞翮
2023-03-14

不,它不是有效的C而且从来都不是有效的C。这些例子就是所谓的违反标准的约束。

标准不允许初始化/分配一个指针给一个整数,也不允许将一个整数给一个指针。您需要用强制转换手动强制类型转换:

int* p = (int*) 0x1234;

int i = (int)p;

如果不使用强制转换,则代码不是有效的C并且不允许编译器在不显示消息的情况下让代码通过。具体地说,这是由简单转让规则C17 6.5.16.1§1规定的:

6.5.16.1简单分配

约束条件

应符合下列条件之一:

    null

整数可以转换为任何指针类型。除了前面指定的,结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是陷阱表示。68)

任何指针类型都可以转换为整数类型。除了前面指定的,结果是实现定义的。如果结果不能在整数类型中表示,则该行为是未定义的。结果不需要在任何整数类型的值范围内。

足部提示:

 类似资料:
  • 假设代码是用c11编译的,并且启用了严格别名。 我不是在寻找一种不同的方法,我想专注于这个具体的问题,以及它是否可行或为什么不可行。 (如果我无意中犯了一些无关的错误,请告诉我,我会改正的) C11标准说: 6.2.5.28所有指向结构类型的指针应具有彼此相同的表示和对齐要求。 6.7.2.1.6结构是由成员序列组成的类型,其存储按有序顺序分配 这意味着结构A和B中指针的大小和对齐方式相同。 结构

  • 我有以下结构: void*arr保存指向内存中某些单元格的指针。每个单元格都有一个指向内存中另一个单元格的空指针(作为链表)、一个char*字符串和一个具有自己大小的值。 编辑--因为它是一个指针链表,难道我不能也做一些类似于-map->arr+index*sizeof(Void*)的事情来获得给定单元格的开始吗?

  • 指针变量数据类型的强制转换 必须显式强制类型转换,不允许隐式类型转换 指向空间的强制类型转换,本质上就是普通变量的强制类型转换 int a = 10; float b = 3.14; int *pa = &a; float *pb = &b; *pa = (int)*pb; // 等价于 a = (int)b; 指针本身强制类型转换,改变的是对其指向空间的引用方式(空间大小和存储结构) int

  • 考虑以下代码: 我必须定义一个回调函数,我想在该函数中使用一些附加信息。我定义了自己的结构并将成员的地址传递给函数。在函数中,我想通过强制转换“检索”整个结构,但指针似乎不匹配,我得到了错误的结果。我想我在选演员时做错了什么,但我不确定是什么?

  • 公有派生类的对象可作为其相应基类的对象处理,这使得一些有意义的操作成为可能。例如,从某个特定基类派生出来的各种类,尽管这些类的对象彼此之间互不相同,但是仍然能够建立这些对象的链表,只要把这些对象作为基类对象处理就可以了。然而反过来是不行的,基类的对象不能自动成为派生类的对象。 常见编程错误 9.1 将基类对象作为派生类对象处理。 程序员可以用显式类型转换把基类指针强制转换为派生类指针。但是,如果要