为什么ptr=(int*)12和*ptr=42在C语言中是糟糕的编程?

为什么ptr=(int*)12和*ptr=42在C语言中是糟糕的编程?,c,C,有一个C代码,我想知道哪里是坏的部分 int main() { // PART A int a = 12; printf("%p\n", &a); int *ptr = &a; *ptr = 15; printf("%i\n", a); // PART B: something bad starts ptr = (int*)12; *ptr = 42; printf("%i\n", *ptr); }

有一个C代码,我想知道哪里是坏的部分

int main() {
    // PART A
    int a = 12;
    printf("%p\n", &a);
    int *ptr = &a;
    *ptr = 15;
    printf("%i\n", a);
    // PART B: something bad starts
    ptr = (int*)12;
    *ptr = 42;
    printf("%i\n", *ptr);
}
在B部分中,为什么C中的ptr=int*12和*ptr=42编程不好?

问题是:

ptr = (int*)12; // This will assign memory address 0x0000000C (12) to ptr
您试图在不知道指针是否存在的情况下将内存地址分配给指针。程序可能会在这里崩溃

此外: printf%f\n,&a;← 这应该是%p的问题

ptr = (int*)12;
*ptr = 42;  

它正在写入可能属于程序或操作系统的位置。如果地址12属于该程序,则其行为将不稳定。若它属于操作系统,那个么程序很可能会崩溃。

ptr现在是指向int 12的指针。否,ptr指向地址12,该地址禁止修改程序在计算printf%f\n和a时有未定义的行为,因为%f表示参数需要是双精度的,但实际上您提供的是int*。标题可以更具体,但我不会投反对票:它的格式很好,对于具有不同语言背景的人来说,指针可能需要一些时间才能掌握。如果您使用内存映射硬件,其中位置12是一个设备寄存器,并且您想将42写入该设备寄存器,那么不好的部分是非常有效的。@HAruMOmo no,在这种情况下,它是从值到指针的强制转换,可能您想获取变量的地址,但它是&运算符,不能用于常量值,因此所有与代码混合的声明在c中都不好,它们当然是有效的,但我相信,如果将声明与代码分开,代码更容易阅读。更严格地说,printf%p\n,void*&a;它可能会在*ptr=42时崩溃,不是吗?@James,可能会,可能不会。。。现在@解释了。ptr和*ptr是一样的吗?不是。ptr是指针,而*ptr是内存地址ptr指向的别名。别名是什么意思?别名是该位置的另一个名称。@HAruMOmo地址可能存在,它指向什么,或者你是否有权访问它我不确定,如果它指向你的电脑的较低内存,我怀疑,这是内存通常用于一些重要的东西,如中断向量表或bios,你甚至不想尝试覆盖的东西。