C 结构数组的别名地址为int

C 结构数组的别名地址为int,c,arrays,pointers,strict-aliasing,C,Arrays,Pointers,Strict Aliasing,我们都知道结构应该指向结构中第一个元素的地址。为什么这样取消引用,它会返回地址本身呢?您的代码表现出未定义的行为 您正在将结构*强制转换为键入int*并取消引用。当int的大小(大多数情况下)更大时,您正在访问越界内存。(这是一个原因,还有几个原因) 正确使用结构是: +---+---+---+---+ | h | i | ? | ? | +---+---+---+---+ Print as int: ? ? i h if machine is little endian In ascii

我们都知道
结构
应该指向结构中第一个元素的地址。为什么这样取消引用,它会返回地址本身呢?

您的代码表现出未定义的行为

您正在将
结构*
强制转换为键入
int*
并取消引用。当
int
的大小(大多数情况下)更大时,您正在访问越界内存。(这是一个原因,还有几个原因)

正确使用结构是:

+---+---+---+---+
| h | i | ? | ? |
+---+---+---+---+
Print as int: ? ? i h if machine is little endian

In ascii coding
+---+---+---+---+
| 68| 69| ? | ? |
+---+---+---+---+
Print as int: ?? ?? 69 68

您的代码表现出未定义的行为

您正在将
结构*
强制转换为键入
int*
并取消引用。当
int
的大小(大多数情况下)更大时,您正在访问越界内存。(这是一个原因,还有几个原因)

正确使用结构是:

+---+---+---+---+
| h | i | ? | ? |
+---+---+---+---+
Print as int: ? ? i h if machine is little endian

In ascii coding
+---+---+---+---+
| 68| 69| ? | ? |
+---+---+---+---+
Print as int: ?? ?? 69 68

这里有一个名为structure的数组。它的名字给出了地址。因此,您不需要在它之前使用&operator


您可以有p=&structure[0];或p=结构

这里有一个名为structure的数组。它的名字给出了地址。因此,您不需要在它之前使用&operator


您可以有p=&structure[0];或p=结构

这会由于违反严格的别名规则而导致未定义的行为

通过表达式
*(int*)读取某些\u指针时,它仅在以下情况下有效:

  • 某些指针
    指向使用类型
    int
    无符号int
    声明的对象(可选使用
    const
    volatile
    限定符)
  • 一些\u指针
    指向动态分配的存储区,该存储区以前已将
    int
    无符号int
    写入到该位置
某些编译器可能会根据此规则进行优化。有关此功能的好处的更多信息

即使您的字符数组中至少包含
sizeof(int)
字节,编译器也可能会忽略(或更糟!)您将这些字符别名为
int
的尝试。尽管如此,人们在“真实”代码中尝试这一点并不少见,这就是为什么许多现有代码必须使用
-fno严格别名编译的原因


注意。如果
int
结构
未正确对齐,也可能存在未定义的行为。这会由于违反严格的别名规则而导致未定义的行为

通过表达式
*(int*)读取某些\u指针时,它仅在以下情况下有效:

  • 某些指针
    指向使用类型
    int
    无符号int
    声明的对象(可选使用
    const
    volatile
    限定符)
  • 一些\u指针
    指向动态分配的存储区,该存储区以前已将
    int
    无符号int
    写入到该位置
某些编译器可能会根据此规则进行优化。有关此功能的好处的更多信息

即使您的字符数组中至少包含
sizeof(int)
字节,编译器也可能会忽略(或更糟!)您将这些字符别名为
int
的尝试。尽管如此,人们在“真实”代码中尝试这一点并不少见,这就是为什么许多现有代码必须使用
-fno严格别名编译的原因



注意。如果
int
structure
没有正确对齐,
int

也可能存在未定义的行为。指向这些的指针是不可互换的。你用什么来编译这个?默认情况下,即使缺少
,clang和gcc在该代码上也应该失败修复。我认为这只是一个重复:@BillLynch我同意他误解了
(int*)结构==(int*)和结构
,尽管这里还有一个机器人在运行,
int
不是
字符
。指向这些的指针是不可互换的。你用什么来编译这个?默认情况下,即使缺少
,clang和gcc在该代码上也应该失败已修复。我认为这只是一个重复:@BillLynch我同意他误解了这里的
(int*)结构==(int*)和结构
,尽管有一个更为活跃的bot,即使我将其更改为
char*
,它仍然不会返回值,而是返回地址本例中的可变随机字符/Yes,那么如果声明是struct test structure[]={{h'},{i'},如何获得
'h'
?@BillLynch;,那么它将是h0i0。(0不是字符)。谢谢你,埃尔扎。如果我不使用“与”符号,它就可以工作。即使我将其更改为
char*
它仍然不会返回值,而是返回地址本例中的可变随机字符/Yes,那么如果声明是struct test structure[]={{h'},{i'},如何获得
'h'
?@BillLynch;,那么它将是h0i0。(0不是字符)。谢谢你,埃尔扎。如果我不使用符号,它就可以工作。我正在尝试重新创建
fread
,并使其从另一个实例而不是文件流执行相同的操作。我正在尝试重新创建
fread
,并使其从另一个实例而不是文件流执行相同的操作。
struct test s1   = {'h', 'i'};
struct test s2[] = { {'t', 'o'}, {'d', 'o'} };

printf("s1   : %c, %c\n", s1.member1, s1.member2);
printf("s2[0]: %c, %c\n", s2[0].member1, s2[0].member2);
printf("s2[1]: %c, %c\n", s2[1].member1, s2[1].member2);