1
{
    int *p=12;
    printf("%p",p);
    printf("\n%d",p);
}

输出:

0000000C

12

问题:那么 p 是否分配了地址 0x0000000C?

{ 
    int *p=12;
    *p=22;
}    

但是这个不运行。那么究竟发生了什么?

4

2 回答 2

4
int *p=12;

这声明了一个指针并设置它指向的地址12

*p=22;

这将取消引用指针并将 22 写入int该内存地址12。由于您没有分配任何内存,只是将指针设置为指向随机地址,因此会导致运行时错误。

让您感到困惑的是,这两段代码都包含*p=.... 但是,第一个赋值是指针,第二个赋值是指针。这只是用 C 编程时必须习惯的符号重载之一。

于 2012-05-04T12:49:56.823 回答
0

这两种情况都有未定义的行为。

  • 第一个示例的行为未定义,因为您使用了无效指针。

  • 第二个示例最糟糕,因为您取消引用具有无效地址的指针。

    int *p=12; // set the address 12 to the int pointer called p
    *p=22;     // set the value 22 to the address 12 (invalid address)
    
于 2012-05-04T12:49:35.770 回答