2016-09-29 76 views
2

所以我知道这个问题很可能以前被问过,但经过近一个小时的搜索之后,我决定要求所有这些。指点我已经回答的一个dublicate问题真的会被赞赏。更改指针(C)时数组元素会发生什么?

然后,在基本的C语言编程中,我很好奇数组元素在改变指针指向别的元素时会发生什么?它是否安全,没有先释放它?例如,

int main() 
{ 
    const int size = 3; 
    int *p_arr = malloc(size * sizeof(int)); 

    for(int i=0; i<size; i++) 
     p_arr[i] = i; 

    int arr[size] = {0,0,0}; 

    p_arr = arr; // safe!? 

    // What happens to the data previously allocated 
    // and stored in *p_arr? Should one first call, 
    // free(p_arr) 
    // and then reallocate ..? 
} 

实际上,更改指针会将数据{0,1,2}留在内存中。这个可以吗?

非常感谢您的帮助!

+0

注意:VLA不能有初始化列表。另外'p_arr = &arr;' - >'p_arr = arr;'但是这会导致内存泄漏。 – BLUEPIXY

+0

这是内存泄漏。请参阅:[如果我在同一个指针(C)上使用malloc两次会发生什么?](http://stackoverflow.com/questions/19435433/what-happens-if-i-use-malloc-twice-on-the- same-pointer-c) –

+1

@BLUEPIXY ..是的,我同意,在创建MWE时我有点太快,但是这并不重要。不过,我已更正了错字以及其他一些拼写错误。 – magnus

回答

2

除了无法访问数据(“泄漏”)以外,数据没有任何反应,因此内存永远被浪费,直到程序终止(通常情况下)才能用于其他任何事情。

不要这样做,泄漏内存是非常糟糕的做法。

你应该在free()内存时不再需要它。

此外,分配可以写成:

p_arr = malloc(size * sizeof *p_arr); 

以除去int类型的复制,并锁定尺寸与实际的变量。这至少有点安全。

+0

“_因此记忆永远被浪费了......”这听起来非常令人难过,你对这个可怜的记忆做了些什么。 –

+0

谢谢,这正是我所怀疑和需要得到的答案。谢谢!在达到期限时我会接受答案。 – magnus

+1

@GillBates这很重要,如果你对自己的资源感到满意,它会有所帮助。 :) – unwind

0

数组{0,1,2}已经在内存中,但除非再次指向指向数组头部地址的指针,否则无法获取它。

相关问题