{
int *p=12;
printf("%p",p);
printf("\n%d",p);
}
输出:
0000000C
12
问题:那么 p 是否分配了地址 0x0000000C?
{
int *p=12;
*p=22;
}
但是这个不运行。那么究竟发生了什么?
int *p=12;
这声明了一个指针并设置它指向的地址12
。
*p=22;
这将取消引用指针并将 22 写入int
该内存地址12
。由于您没有分配任何内存,只是将指针设置为指向随机地址,因此会导致运行时错误。
让您感到困惑的是,这两段代码都包含*p=...
. 但是,第一个赋值是指针,第二个赋值是指针。这只是用 C 编程时必须习惯的符号重载之一。
这两种情况都有未定义的行为。
第一个示例的行为未定义,因为您使用了无效指针。
第二个示例最糟糕,因为您取消引用具有无效地址的指针。
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)