指针与引用变量的类型不同

时间:2017-01-23 14:27:01

标签: c pointers types

我目前正在学习如何使用C编程。今天我开始使用指针,我遇到了以下情况。当我编译程序时

#include<stdio.h>

int main() {

    int a;
    double * p;
    p = &a;
    *p = 12.34;
    printf("%d\n",a);
    * (int *) p = 12.34;
    printf("%d\n",a);

    return 0;
}

它说

$ gcc zeigertypen.c 
zeigertypen.c: In function ‘main’:
zeigertypen.c:7:7: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]

并在执行时,我得到输出

2061584302
Speicherzugriffsfehler (Speicherabzug geschrieben)

错误消息是德语,例如

memory access error (core dumped)

但是,如果我注释掉行*p = 12.34;,则错误消失,输出为

0
12

代码的目的是演示与它们引用的变量不同类型的指针的问题。根据我用来学习C ++的教科书,输出应该是

2061584302
12

2 个答案:

答案 0 :(得分:5)

p = &a;的行为实际上是未定义

C和C ++都不允许您将&a(指向int的指针)的类型重新解释为指向double的指针。

(int*)p同样存在问题,但到那时已经造成了损害。

您可以转发void*,并从void*返回原始类型:现在,将这些视为唯一可以将指针类型转换为其他类型的情况类型。

答案 1 :(得分:0)

解释代码:(根据您的教科书)

#include<stdio.h>

int main() {

    int a;  // size let say (2 byte or 4 )
    double * p; // it will point to continous memory of 8 byte
    p = &a;     // Now because of this ,starting from first byte of a it will derefer 8 bytes (but Undefined behaviour acc to C standards)
    *p = 12.34;  // assigned to those 8 bytes
    printf("%d\n",a);  // first (2 or 4 ) bytes of that value in *p assignment as it starts from a
    * (int *) p = 12.34; // now you type casted it to derefer 2 bytes so store 12 in those (2 or 4) bytes as int
    printf("%d\n",a); // first (2 or 4) bytes of that value in *p assignment

    return 0;
}

如果你需要更多的解释评论并问我。谢谢。