且这段代码涉及的错误,我不太理解#include <stdio.h>

在小甲鱼的课程中,他用虚拟机上演示的结果是1和2,我用dev得到的是0和2,为什么会出现这样的不同,且这段代码涉及的错误,我不太理解


#include<stdio.h>

int main(void)
{
    char a = 0,b = 0;
    int *p = (int *)&b;
    *p = 258;
    printf("%d %d\n",a,b);
    return 0;
}

*p = 258;
这样写结果是不可知的,因为int *写入4个字节,而b有效的存储只有1个字节
那么后面写的那3个字节,是干嘛的,是否影响到了别的变量的存储,这个不同编译器是不同的
1 2说明写到a变量的存储了,说明课程里的编译器的内存分布比较紧凑
你的0 2说明没有影响到a

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/231229
  • 除此之外, 这篇博客: C语言#include<stdio.h>什么意思?中的 二、stdio.h是什么 ? 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    我明白你的问题。在这段代码中,涉及到了一种称为类型转换的操作,并且这是一种危险的行为。代码中的错误在于试图将一个char类型的变量b的地址赋给了一个int类型的指针p,然后通过对指针p进行解引用,将值258写入了变量b中。这样的类型转换超出了C语言定义的行为,所以它会导致未定义的行为。因此,无法保证代码的行为是可预测的,不同的编译器可能会得出不同的结果。

    在这种情况下,你可能会看到不同的的结果。根据你的描述,小甲鱼的虚拟机上的编译器可能对这种类型转换进行了一些特殊处理,导致输出结果为1和2。而你使用的Dev C++编译器可能对这种类型转换没有进行特殊处理,因此得到了不同的结果为0和2。

    为了解决这个问题,可以避免进行这种类型转换,或者使用一种可移植的方式来执行这种转换。以下是两种可能的解决方案:

    解决方案1:避免类型转换 你可以避免将char类型的变量b的地址赋给int类型的指针p,从而避免类型转换。修改代码如下:

    #include <stdio.h>
    
    int main(void)
    {
        char a = 0, b = 0;
        int c = 258;  // 使用int类型的变量来保存258
        b = (char)c; // 将int类型的变量c强制转换为char类型,并赋值给b
        printf("%d %d\n", a, b);
        return 0;
    }
    

    这样修改代码后,不再涉及到类型转换,输出结果应该为0和2。

    解决方案2:使用无符号类型 另一种解决方案是使用无符号类型进行操作,这样可以避免一些类型转换问题。修改代码如下:

    #include <stdio.h>
    
    int main(void)
    {
        char a = 0;
        unsigned char b = 0;
        unsigned int *p = (unsigned int *)&b;
        *p = 258;
        printf("%d %d\n", a, b);
        return 0;
    }
    

    在这个修改的版本中,我们将变量b声明为unsigned char类型,并且将指针p声明为unsigned int类型。这样就避免了在涉及到类型转换时可能产生的一些问题。输出结果应该为0和2。

    请注意,这些解决方案是在代码的特定情况下提供的,并不能完全解决所有可能的问题。在实际开发中,应该避免进行这种不安全的类型转换,并且需要小心处理不同类型之间的转换操作。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^