gpt4 book ai didi

c - 通过转换为结构来分配给数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:19:39 25 4
gpt4 key购买 nike

为什么下面的代码有效?

#include <stdio.h>
#define LEN 12

typedef struct
{
char buffer[LEN];
} string;

int main()
{
char buffer1[LEN] = "Hello World";
char buffer2[LEN];

*(string*)buffer2 = *(string*)buffer1;

printf("%s",buffer2);
return 0;
}

据我所知,我无法将一个数组分配给另一个数组。

最佳答案

C 允许将一个结构分配给另一个相同类型的结构,这样做的语义是根据结构表示定义的,而不是逐个成员的副本。结构表示包含数组的表示并不意味着将包含数组的结构的值分配给另一个结构会违反 C 禁止将一个数组分配给另一个数组的禁令。

C 进一步保证结构的第一个成员的地址与结构本身的地址相同,并且它允许对象指针在不同的指针类型之间转换。在那种情况下,这种转换的结果不能保证正确对齐,如果没有正确对齐,则取消引用该结果会产生未定义的行为。

另一方面,编译器可以自由地在结构表示中包含尾部填充。通常这样做是为了对齐目的。如果您的编译器为您的结构执行此操作——如果它对其应用 64 位或更高的对齐要求,它可能执行此操作——那么您的赋值会产生未定义的行为。在那种情况下,如果它看起来有效,那是因为你很幸运。

但是,如果事实证明上述两种未定义行为的来源都不适用,那么期望代码按预期工作确实是合理的。但是,由于很难预测是否会出现这种情况,因此建议您避免使用这样的代码。

一个更好的问题可能是为什么 C 不允许数组复制。可能有几个原因,但我认为最深层次的原因仅仅是为了一致性。在几乎所有上下文中,当表达式或子表达式的计算结果为数组时,该值衰减 为指向第一个数组元素的指针。这包括构成 = 运算符的操作数的子表达式。所以在普通的 C 表达式中,数组赋值实际上是指针赋值,并且没有预期的语义。为了允许数组赋值,人们将不得不为这种情况精心设计一个合适的特例。

关于c - 通过转换为结构来分配给数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37972848/

25 4 0
文章推荐: java - 读取环境变量失败
文章推荐: python - 使用 train_test_split 的一个命令创建数据集的多分割
文章推荐: java - Netbeans JAX-WS 客户端 - 编码错误
文章推荐: html - 创建自定义形状的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com