我有以下代码,但我的输出不正确.任何人都可以告诉我为什么输出10 B只是为什么我没有A输出?
#include<stdio.h>
#include<conio.h>
void main()
{
int *p;
char c,d;
int i;
clrscr();
p=&i;
*p=10;
(char *)p=&c;
*p=65;
(char *)p=&d;
*p=66;
printf("%d%c%c",i,c,d);
getch();
}
Run Code Online (Sandbox Code Playgroud)
您的程序调用未定义的行为,因此没有正确或不正确的行为.特别:
*p = 65;
Run Code Online (Sandbox Code Playgroud)
将一个整数写入内存,只有a的空间char.C99§6.5.3.2/ 4(地址和间接操作)规定:
如果操作数的类型为''指向类型'',则结果的类型为''type''.如果为指针指定了无效值,则unary*运算符的行为未定义.84)
p有类型指针int,所以*p有类型int.但是,p不是有效int对象的地址.
另外,我认为作业左侧的演员是非法的(GCC肯定是这么认为的).
我相信正在发生的事情是它的布局(增加收益)如:
|i|i|i|i|d|c|p|p|p|p|
Run Code Online (Sandbox Code Playgroud)
这表示每个占用的字节数.我会介绍一下我的想法:
p = &i;
|i|i|i|i|d|c|00|00|00|00|
Run Code Online (Sandbox Code Playgroud)
为简单起见,我假设地址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|
Run Code Online (Sandbox Code Playgroud)
请注意修改*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|
Run Code Online (Sandbox Code Playgroud)
因此存储为d覆盖cNULL.如果您的机器是little-endian,具有4字节的整数,并且堆栈向上(朝向较低地址),则上述情况适用.如果你有2字节的整数,分析是不同的,但主要结论仍然适用.
返回void也是非法的,但这是无关的.