问题:“当我删除 p1=(int *)malloc(sizeof(int)); 和 p2=(int *)malloc(sizeof(int)); 行时,输出没有改变。你能解释一下原因吗? "
答:因为您不再使用分配给 p1 和 p2 的内存,因为您将 a 的地址分配给 p1,然后将现在存储在 p1 中的地址分配给 p2
也许在代码中解释得更好
int main()
{
int *p1,*p2; // define two pointers to int
int a; // define an int variable (space for an int in memory must be reserved)
p1=(int *)malloc(sizeof(int)); // get memory large enough for an int. (int *) makes the default return value of pointer to void a pointer to int
p2=(int *)malloc(sizeof(int)); // same thing but for the other point
p1=&a; // overwrite p1 and puts in it the address used for integer variable a
p2=p1; // overwrite p2 with what p1 has and that is the address of integer variable a
a=10; // now put where the integer variable a has its address the value 10 to
printf("\n%d\n",*p1); // output what p1 points to (and it points to address of integer variable a)
printf("\n%d\n",*p2); // same for p2
printf("\n%d\n",a); // just output a
return 0;
}
跟踪变量
int main()
{
int *p1,*p2;
int a; // &a = 0xDDDDDDDD
p1=(int *)malloc(sizeof(int)); // p1 = 0xAAAAAAAA
p2=(int *)malloc(sizeof(int)); // p2 = 0xAAAAAAAD
p1=&a; // p1 = 0xDDDDDDDD
p2=p1; // p2 = 0xDDDDDDDD
a=10; // a=10 (at address 0xDDDDDDDD)
printf("\n%d\n",*p1);
printf("\n%d\n",*p2);
printf("\n%d\n",a);
return 0;
}
关于如何获取地址的地址的附加说明a
。这是一个自动变量,在输入函数时创建并在退出时丢弃。因此,虽然a
只是声明并且没有分配任何内容,但仍为其分配了内存。
引自 K&R 附录 A
A4.1 存储类
.. 自动对象是块的本地对象,并在退出块时被丢弃。块内的声明创建自动对象...