(int*)&var是什么意思?

Kha*_*CTG 3 c pointers

是什么意思(int*) &i

  char i;
  int* p = (int*) &i;
  ...
  *p = 1234567892;
  ...
Run Code Online (Sandbox Code Playgroud)

如果是的话* &i,我会理解.但在这种情况下,这是一个" int".

Mic*_*ael 7

&i:表示取i的地址(这是一个char*)

(int*)&i :将指针转换为指向整数的指针(这是坏/错的,但是你告诉编译器这样做,所以它甚至不会发出警告)

int* p = (int*)&i; :一个声明,表示将i的指针存储在p中(并将其转换为:编译器甚至不会抱怨)

*p = 1234567892;:写这个值,它是p指向的址的几个字节(虽然p认为它指向一个int,但是为char!).其中一个字节将以i结尾,但其他字节将覆盖相邻i的字节.


zwo*_*wol 5

构造(int *) &var,其中var是a char,获取指针var,然后将其转换为不同类型的指针(即int).程序稍后将int值写入指针.由于指针实际上指向a char,一个int值不适合,这会触发未定义的行为,这是一个奇特的名称,"字面上任何东西(你的计算机可以实际完成)可能发生 - 这个程序是错误的".

编辑:根据要求,一些标准学来解释为什么这个程序有未定义的行为.以下所有部分参考均为N1570,这是与C2011官方文本最接近的,可以在线免费访问.

作为序言,在阅读C标准的文本时,您需要知道"应该"这个词具有特殊的意义.任何包含单词"shall"的句子都对程序或编译器和运行时环境提出了硬性要求; 你必须从上下文中找出哪一个.该计划有两种硬性要求.如果"约束"部分中出现"必须"句子,那么编译器需要诊断违规(第5.1.1.3节)(标准从不平坦地说必须拒绝一个程序,但那是硬件之间的通常线条错误和警告).如果"shall"句子出现在其他地方,则编译器不需要诊断它,但是违反要求的程序具有未定义的行为(§4p1,2).有时文本会说"如果是X,那么行为是未定义的"; 后果没有区别.

首先,转换(int *) &var转换char *int *, §6.3.2.3p7明确允许时,当且仅当指针的值与类型的对象char正确对齐时int.

指向对象类型的指针可以转换为指向不同对象类型的指针.如果生成的指针未针对引用的类型正确对齐,则行为未定义.否则,当再次转换回来时,结果将等于原始指针.

显示的代码中没有任何内容可以确保对于a var进行适当的对齐int,因此程序可能已经触发了此时未定义的行为,但我们假设它正确对齐.将类型的值保存int *到使用该类型声明的变量中是没有问题的.接下来的操作是*p = integer_literal.这是对对象存储值写访问var,必须遵守§6.5p6,7中的规则:

  1. 用于访问其存储值的对象的有效类型是对象的声明类型(如果有).[...更多关于如果对象没有声明类型会发生什么的文本; 这里不相关......]

  2. 对象的存储值只能由具有以下类型之一的左值表达式访问:

    • 与对象的有效类型兼容的类型,
    • 与对象的有效类型兼容的类型的限定版本,
    • 与对象的有效类型对应的有符号或无符号类型的类型,
    • 与有效类型的对象的限定版本对应的有符号或无符号类型的类型,
    • 聚合或联合类型,包括其成员中的上述类型之一(包括递归地,子聚合或包含联合的成员),或者
    • 一个字符类型

对于类似int和的简单算术类型char,兼容类型在剥离后typedef表示相同的类型. (确切的定义分布在§§6.2.7,6.7.2,6.7.3和6.7.6.)对于这种分析而言,重要的是声明的类型varchar,但是左值表达式*p具有类型int; int不兼容char,int不是字符类型.因此,该程序违反了单词"shall"所声明的要求,该要求不在名为"constraints"的部分中,并且其行为未定义.

注意最后一个项目符号点的不对称性. 任何对象都可以通过具有字符类型的左值表达式访问其存储值,但声明具有字符类型的对象可能无法由具有不兼容类型的左值表达式访问.是的,这意味着访问一个大的共同成语阵列的字符(如数据从文件中读取的缓冲)"四在时间"的经由一个指针int是,严格地说,无效.许多编译器对这种情况的指针别名规则做了一个特殊的例外,以避免使该习惯用法无效.

但是,通过指针访问单个charint也是无效的,因为(在大多数系统上)int大于char,因此您读取或写入超出对象末尾的字节.该标准并不打算将该案例与阵列案例区分开来,但无论如何它都会对你不利.