您的程序调用未定义的行为,所以没有正确或不正确的行为。具体做法是:
*p = 65;
写入的整数到内存中,只有一个char
室。 C99§6.5.3.2/ 4(地址和间接操作)状态:
如果操作数具有type''类型''的指针,则结果的类型为'type''。如果无效值已被分配给所述指针,一元运算符*的行为是理解过程音响ned.84)
p
有类型指针int
,所以*p
具有类型int
。但是,p
不是有效的int
对象的地址。
另外,我相信作业左侧的剧组是非法的(GCC肯定是这么认为的)。
我相信发生的事情是,它奠定了(增加addressess),如:
|i|i|i|i|d|c|p|p|p|p|
这代表分别占用的字节数。我会通过什么,我认为正在发生的事情走路:
p = &i;
|i|i|i|i|d|c|00|00|00|00|
为简单起见,我假设的i
地址为0
*p=10;
|10|0|0|0|d|c|00|00|00|00|
p=&c;
|10|0|0|0|d|c|05|00|00|00|
*p=65;
|i|i|i|i|d|65|00|00|00|00|
请注意,修改*p
覆盖p
。
p=&d;
|10|0|0|0|d|65|04|00|00|00|
*p=66;
|10|0|0|0|66|00|00|00|00|00|
所以存储到d
覆盖c
用NULL。如果你的机器是小端的,有4个字节的整数,并且堆栈向上(朝着低地址)增长,上述情况适用。如果您有2个字节的整数,分析是不同的,但主要结论仍然适用。
返回void
也是非法的,但这是无关的。
是'残培()'在Windows关闭命令提示符之前等待用户输入? – 2010-10-28 05:38:35
这是一个特定于平台的问题,所以应该提供该信息(操作系统,编译器等) – 2010-10-28 05:40:22