【问题标题】:Pointers and Memory Allocation in CC中的指针和内存分配
【发布时间】: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


【解决方案1】:

这一行将变量x地址存储在z指向的内存中:

*z = &x;

这一行将x存储到y指向的内存中:

*y = x;

这两个赋值语句是不相关的:第二个进行复制,而第一个没有。如果更改x 的值,然后检索**z,您将看到x 的新值;但是,检索*y 会返回x 的旧值(即1)。

【讨论】:

  • 谢谢!这很有意义!
【解决方案2】:

z 是指向指针的指针(通常指向动态分配的指针数组)。

y 是指向int 的指针。同样,它通常会指向动态分配的 ints 数组。

所以,*z = &x; 正在设置z 所指的指针指向x。即,z 指向一个指针,该指针(反过来)指向x

*y = x; 正在获取x,并将其分配给y 指向的int

对于这样的事情,图片通常很有帮助。所以,我们的基本定义给了我们这个:

我们做的:

z = (int **) malloc (sizeof(int *));
y = (int *) malloc (sizeof(int));

这给了我们这个:

然后我们这样做:

*z = &x;
*y = x;

这给了我们这个:

在所有这些中,虚线表示从一个位置到另一个位置的指针,而实线表示将值从一个位置复制到另一个位置。

然后我们可以考虑它们之间的长期差异。例如,考虑如果我们在上述所有分配之后添加x=2; 会发生什么。

在这种情况下,*y 仍将等于 1,因为我们将值 1x 复制到 *y**z 将等于 2,因为它只是指向 x 的指针——x 的任何更改都将反映在 **z 中。

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2016-02-21
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多