如何在C中将两个变量的int地址转换为char指针?

Shi*_*ngi 1 c

我有以下代码,但我的输出不正确.任何人都可以告诉我为什么输出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)

Mat*_*hen 5

您的程序调用未定义的行为,因此没有正确或不正确的行为.特别:

*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也是非法的,但这是无关的.