2011-11-05 57 views
0

我现在正在上课的指针,我们的教科书让我有点困惑。他们开始通过说下面的例子复制的地方价值指向的资金投入到地方通过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; 
+0

我只是想感谢你们所提供的帮助! – JeramyRR

回答

2

请注意以下事项:

  • myMoneymoney是指针,所以myMoney = money;拷贝一个指针超过另一个。现在你有两个指针指向相同的东西(money指向什么),并没有指出myMoney用来指向什么(这是内存泄漏)。
  • *myMoney*money指出由指针的值(因为*指针引用指针得到什么它指向),所以*myMoney = *money;副本什么money点在什么myMoney点;指针本身没有改变。
  • alpha数组,它可以是降级到一个指向数组中的第一个元素的指针。
  • alphaPtr没有泄漏,因为它并没有指向任何东西。
  • 是的,char *alphaPtr = *alpha;本来是一个更好的方式来写它,因为然后alphaPtr不花任何时间未初始化。有些编译器甚至会在你声明像教科书示例那样的未初始化的指针时发出警告。
  • 使用(取消引用)未初始化的指针是一个坏事,因为它导致可怕的未定义的行为。你的程序可能会立即崩溃,或者它可能会在晚些时候崩溃,或者它可能会在没有告诉你任何事情的情况下简单地破坏你的数据,并且只有几个月后才会发现它。如果myMoney以前在动态分配的内存指向
+0

对不起,只是修复了“链接”部分。 – JeramyRR

+0

谢谢。我不知道为什么当我第一次在教科书中看到它时,我没有得到。出于某种原因,我在想,当它首次被宣布时,它会保留一个内存插槽,然后当我们稍后分配它时,它会从内存插槽中断开并创建另一个插槽,但这是错误的想法。 – JeramyRR

+1

指针是编程中更加棘手的主题之一。它需要从代数的“一个变量持有一个价值”的心态跃进,因为如果它是一个指针,变量现在仅仅包含一个没有(本科)数学并行的值的地址(外部计算机科学,至少)。 –

0

第二个例子会导致内存泄漏,因为* myMoney指出原来的位置就不再访问。这是因为用于存放指针的内存现在是一个实际的浮点值而不是内存地址?

存储在myMoney中的内存位置现在丢失。如果它被分配了,那么将无法恢复它的地址来释放它。

在第二个示例中,数组是特殊的,通过名称引用它们引用它们的地址。

0

与分配指针

myMoney = money; 

的问题就是,如果myMoney是唯一的指针值,你不再有任何的方式来访问它。

+1

所以,如果我从来没有指针指向任何声明过程中,我什么时候不会丢失任何东西? – JeramyRR

+1

没错,但是如果你没有值来分配它,你可能不应该声明一个指针。当指向对象的* last *指针丢失时发生泄漏。那么你现在不再是那个对象的地方了。 –

+0

因此,如果发生内存泄漏,垃圾回收器是否会回收该内存供以后使用,或者只是占用了空间,直到程序终止? – JeramyRR

0

myMoney = money会泄漏。 myMoney正在分配一个新的内存地址指向,所以它最初指向的内存将泄漏,如果没有别的指向它了,所以它可以在以后释放。

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

char *alphaPtr = *alpha不会编译。您正尝试将char分配给char*,这是无效的。

+0

好吧,我在考虑* alpha会将它的地址分配给* alphaPtr。 – JeramyRR

+1

你指定的*指针与你是否泄露内存无关。关键是:指针的以前的值是否指向其他地方没有跟踪的内存?换句话说,指针的* new *值不会导致泄漏,它是* old *值。由于旧的值在'alphaPtr'的情况下无效,因此不会泄漏。 –