【问题标题】:Arrays, pointers, and memory management toy example question in CC 中的数组、指针和内存管理玩具示例问题
【发布时间】:2020-12-09 19:36:48
【问题描述】:

我在玩 C 内存和指针,我有一些问题:

int* foo(){
  int a[100] = ...;
  int* b = malloc(100 * sizeof(int));
  ... do something ... 
  return b
}
  • 退出函数后a消耗的内存是否立即释放?
  • 将定义更改为int b [100]; 是否等效?

【问题讨论】:

    标签: c pointers memory


    【解决方案1】:

    此声明

    int a[100] = ...;
    

    声明一个具有自动存储持续时间的本地对象。所以退出函数后,数组将不再活跃,它的内存可以用于其他目的。

    从函数返回数组

    int b [100];
    

    喜欢

    return b;
    

    使返回的指针无效,因为正如上面所说的那样,数组 b 在退出函数后将不再存在

    至于动态分配的内存

    int* b = malloc(100 * sizeof(int));
    

    只有当你隐式调用函数free或进程停止执行时才会释放它。

    如果数组具有静态存储持续时间,您可以返回该数组。例如

    static int b[100];
    

    【讨论】:

    • 对,所以要明确回答我的问题,我不能int* b = malloc 更改为int b[],对吗?
    • 我认为应该会导致分段错误
    • @AlexColeman 如果您尝试取消引用指向返回数组的指针,可能会发生分段错误。
    • @AlexColeman 如果数组具有静态存储持续时间,您可以返回该数组。
    【解决方案2】:

    请记住,a 的作用域是函数,一旦函数退出它就超出了作用域,这意味着对它的任何引用(如指针)都将失效。了解作用域非常重要,因此在最终无意中将未定义的行为引入程序之前,请务必了解更多相关信息。

    b 更改为与a 相同会使它遇到相同的问题。 malloc() 用于动态分配某些东西,它在free() 之前将一直有效直到显式释放

    不要忘记分配内存伴随着释放它的责任。您需要制定一个计划来处理该分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多