【发布时间】:2013-05-06 16:11:17
【问题描述】:
程序:
int x;
int *y;
int **z;
z = (int **) malloc (sizeof(int *));
y = (int *) malloc (sizeof(int));
x = 1;
*z = &x;
*y = x;
.
.
.
问题: 有什么区别:
*z = &x;
*y = x;
据我了解,*z 指向 x 的地址,*y 指向 x,但是 *y 指向 x 不需要 x 的地址吗?我真的不明白这两个变量发生了什么。
编辑: 我也想知道我们什么时候知道变量是在栈上还是堆上分配的?
- 为什么 x、y 和 z 在堆栈上分配?
- 为什么 *y、**y、*z、**z 分配在堆上?
最后,改变 *z,改变 **z 吗?
【问题讨论】:
-
“据我了解……”你误会了。 z 和 y 仍然指向你分配它们时它们指向的任何内存块。
-
你不应该在 C 中转换
malloc()的返回值。这将有助于识别没有原型的错误。 -
首先,您需要了解最后两个语句是完全不同的。第一个将 x 的 address 分配给 z 指向的任何东西,而第二个将 x 的 value 分配给任何 y 指向的东西。如果您分配一个值,那么原件和副本将“断开连接”,因此更改一个不会更改另一个。但是,如果您只使用地址,那么这两者就会在臀部连接起来——改变一个,然后你改变另一个。
标签: c pointers memory-management