我目前正在课堂上指点,我们的教科书让我感到困惑。他们首先说下面的例子将货币指向的地方的价值复制到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 :(得分:2)
要记住的事情:
myMoney
和money
是指针,因此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*
。