【问题标题】:What happens to the array elements when changing the pointer (C)?更改指针 (C) 时数组元素会发生什么?
【发布时间】:2017-02-07 10:45:01
【问题描述】:

所以我知道这个问题很可能以前被问过,但经过近一个小时的搜索后,我决定问同样的问题。向我指出一个已经回答的重复问题将不胜感激。

然后,用基本的 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} 留在内存中。这样可以吗?

非常感谢您的帮助!

【问题讨论】:

  • 注意:VLA 不能有初始化列表。还有p_arr = &amp;arr; --> p_arr = arr; 但这会导致内存泄漏。
  • @BLUEPIXY .. 是的,我同意,我在创建 MWE 时有点太快了,但这不是重点。不过,我已经更正了拼写错误以及其他一些拼写错误。

标签: c arrays pointers


【解决方案1】:

数据不会发生任何事情,除了它变得无法访问(“泄漏”)并因此内存永远被浪费,它不能用于其他任何事情,直到您的程序终止(通常)。

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

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

另外,分配可以写成:

p_arr = malloc(size * sizeof *p_arr);

删除重复的int 类型,并将大小锁定为实际变量。这至少更安全一些。

【讨论】:

  • 因此记忆永远被浪费了”这听起来令人难以置信的悲伤,你对那糟糕的记忆做了什么。
  • 谢谢,这正是我所怀疑和需要回答的。谢谢!到时我会接受答案。
  • @GillBates 这就是重点,如果您觉得自己的资源很有帮助。 :)
  • 这确实是一种不好的做法,但对于像 OP 这样的简单程序没有任何后果,其中 forever 意味着很少的时间。
  • @chqrlie 确实如此。但是,这只是强调我的问题的一个例子。实际上,我正在编写一个相当大的并行化 MPI 程序,它将在大约 100 人共享的 64 个 CPU 的集群上运行大约 1 小时。所以我认为我应该正确地做到这一点。我主要有 Fortran 的经验,所以 C 中的这个指针对我来说是相当新的..
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多