教科书中的指针示例令我困惑

时间:2011-11-05 03:53:02

标签: c++ pointers

我目前正在课堂上指点,我们的教科书让我感到困惑。他们首先说下面的例子将货币指向的地方的价值复制到myMoney指向的地方:

*myMoney = *money;

然后下一个示例将货币值复制到myMoney

myMoney = money;

第二个示例导致内存泄漏,因为* myMoney指向的原始位置不再可访问。这是因为用于保存指针的内存现在是实际浮点值而不是内存地址吗?

现在,当我们展示不同的声明时,让我感到困惑的部分是下一部分。完整的例子:

char alpha[20];
char *alphaPtr;
char *letterPtr;
vod Process(char []);
.
.
alphaPtr = alpha;
letterPtr = &alpha[0];
Process(alpha);

因为这本书说的是

myMoney = money;

会创建内存泄漏,因为它会切断指针之间的链接并指向地址,

alphaPtr = alpha;

还会导致内存链接吗?他们不应该宣称它像

char *alphaPtr = *alpha;

4 个答案:

答案 0 :(得分:2)

要记住的事情:

  • myMoneymoney是指针,因此myMoney = money;将一个指针复制到另一个指针上。现在你有两个指针指向同一个东西(money指向的东西),没有指向myMoney用来指向的东西(这是内存泄漏)。
  • *myMoney*money是指针指向的值(因为* 取消引用一个指针来获取它的内容指向),因此*myMoney = *money;复制money指向myMoney指向的内容;指针本身没有改变。
  • alpha是一个数组,它可以降级成指向数组中第一个元素的指针。
  • alphaPtr没有泄漏,因为它首先没有指向任何东西。
  • 是的,char *alphaPtr = *alpha;本来是一个更好的写作方式,因为alphaPtr不会花费任何时间未初始化。当您声明未初始化的指针(如教科书示例)时,某些编译器甚至会发出警告。
  • 使用(解除引用)未初始化的指针是坏事,因为它会导致可怕的未定义的行为。您的程序可能会立即崩溃,或者可能会在以后崩溃,或者它可能只是在不告诉你任何事情的情况下破坏你的数据,而且你只会在几个月之后找到它,如果有的话。

答案 1 :(得分:0)

  

第二个示例导致内存泄漏,因为* myMoney指向的原始位置不再可访问。这是因为用于保存指针的内存现在是实际浮点值而不是内存地址吗?

myMoney中存储的内存位置现已丢失。如果它被分配,将无法恢复其地址以解除分配。

在第二个示例中,数组的特殊之处在于,按名称引用它们是引用它们的地址。

答案 2 :(得分:0)

分配指针的问题

myMoney = money;

只是如果myMoney是唯一指向该值的指针,则您无法再以任何方式访问它。

答案 3 :(得分:0)

如果myMoney = money之前指向动态分配的内存,

myMoney将会泄漏。 myMoney被分配了一个新的内存地址指向,所以它最初指向的内存将会泄漏,如果没有其他内容引用它,以便它可以在以后释放。

alphaPtr = alpha不是泄漏。 alpha是实际内存,alphaPtr只是指向它。即使alphaPtr被指定指向别的东西,堆栈上也会存在alpha,当它超出范围时会自动回收。

char *alphaPtr = *alpha无法编译。您正在尝试将char分配给无效的char*