首页 > C语言 > 一个C语言结构体问题

一个C语言结构体问题

无聊的时候又去CSDN转转,肯定会有人讨论题目,这不,看到有人在讨论结构体了。不顾很奇怪的是,似乎所有人都被提问者误导了。先上题目:

#include <stdio.h>
// 定义一个结构体
typedef struct _DATA
{
	char			t;
	char			k;
	unsigned short		i;
	int			m;
} Data, *PData;
 
int main(int argc, char **argv)
{
	int *p = NULL;
	Data d;
	d.t = 0x01;
	d.k = 0x02;
	d.i = 0xab;
	d.m = 0x99;
 
	p = (int *)&d;
	printf("0x%X\n", *p);
 
	return 0;
}

提问的问题是,为何输出了AB0201。提问的人还特别强调了,t和k一起占一个字节,然后后面一大群人讨论结构体对齐的问题……在这里我感觉很奇怪,后面很多人说t占0.5个字节,k占0.5个字节。对此我感觉非常奇怪,不是吗?有char占0.5个字节的说法?

主要还是一个编译器如何对指针取值的问题吧。所有指针所占的内存空间都是一样的,但是编译器如何知道要取多少个字节呢?就是根据指针类型来决定的。比如这里p是一个int指针,当对其解引用时编译器只会提取4个字节的内容出来(好像表达有点问题,反正取多少个字节由指针类型来决定)。根据这条规则可以明白为什么void类型的指针不能解引用。因为编译器无法知道指针所指内容的大小到底是多少。

我感觉奇怪的地方还是他们说结构体成员t和k合占一个字节的问题……


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 一个C语言结构体问题
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: C语言 标签: , ,
  1. pestu
    2011年5月15日23:00 | #1

    估计他们不懂汇编吧。

    [回复]

  2. 2011年5月15日23:15 | #2

    @pestu
    一个人有这样的观点不奇怪,怪就怪在一群人讨论这样的问题

    [回复]

  3. S_A_T
    2012年6月9日21:16 | #3

    不奇怪,x86的字节序“Little endian”(小端模式),所以对于结构体D为:01 02 AB 00 99 00(如果是Win32环境后面为 99 00 00 00)。*p指向的数据为“01 02 AB 00”(32位),所以输出AB0201。

    [回复]

    代码疯子 回复:

    @S_A_T, 嗯 就是这样的

    [回复]