浏览一些旧的C代码,我遇到了这个代码片段.我对幕后发生的事情感到非常困惑.
我没有完全理解结构指针的使用和可操作性,我不太明白如何在以下代码中存储和访问内存.
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);
}
Run Code Online (Sandbox Code Playgroud)
这输出
myY->f1 = 4096
myY->f2 = Stephen Goddard
Run Code Online (Sandbox Code Playgroud)
在演员表之后,i1存储myY->f1并且ch1和ch2都存储在其中myY->f2.我的问题是怎么样?.演员表后的内存内容是什么样的?
我知道它与结构的大小和指针指向的位置(显然)有关,但是看了这段代码后,它肯定让我意识到我缺乏理解指针.
谢谢
内存不受演员影响.演员只是将一个对象视为另一个不同类型的对象.如果你愿意的话,可以把代码想象成有一个union { struct x a; struct y b; },然后写入a但是要阅读b.
这是未定义的行为,但它恰好出现了各种对象相互叠加,因此您可以看到观察到的结果.
第一个strcpy(myX->ch1,"Stephen ");也是未定义的行为,因为缓冲区对于字符串来说太小了.
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |