gpt4 book ai didi

c - C 结构指针后面的内存内容

转载 作者:太空狗 更新时间:2023-10-29 15:55:13 26 4
gpt4 key购买 nike

浏览一些旧的 C 代码时,我发现了这个片段。我对幕后发生的事情感到非常困惑。

我对struct指针的用法和可操作性不是很了解,也不太明白下面的代码是如何存储和访问内存的。

struct x{
int i1;
int i2;
char ch1[8];
char ch2[8];
};

struct y{
long long int f1;
char f2[18];
};

int main(void)
{
struct x * myX;
struct y * myY;
myX = malloc(sizeof(struct x));
myX->i1 = 4096;
myX->i2 = 4096;
strcpy(myX->ch1,"Stephen ");
strcpy(myX->ch2,"Goddard");
myY = (struct y *) myX;
printf("myY->f1 = %d\n", myY->f1);
printf("myY->f2 = %s\n", myY->f2);
}

这输出

 myY->f1 = 4096
myY->f2 = Stephen Goddard

转换后,i1 存储到myY->f1 中,ch1 和ch2 都存储在myY->f2 中。我的问题是如何?。施法后的内存内容是什么样的?

我知道它与结构的大小和指针指向的位置有关(很明显),但是在查看这段代码之后,它确实让我意识到我对指针的理解不足。

谢谢

最佳答案

内存不受施法影响。 Actor 只是将一个对象视为另一个不同类型的对象。如果愿意,可以将代码视为具有 union { struct x a;结构yb; },然后写入 a 但从 b 读取。

这是未定义的行为,但碰巧会出现各种对象相互重叠,因此您会看到观察到的结果。

第一个 strcpy(myX->ch1,"Stephen "); 也是未定义的行为,因为缓冲区对于字符串来说太小了。

关于c - C 结构指针后面的内存内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18688721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com