11.16 为什么拷贝数组不能直接用赋值符号、栈与堆(涉及动态分配的补充)

发布于 4 天前  9 次阅读


数组名通常被视为指向数组首元素的指针,就算你中括号里面的数组下标不是0也是如此(此前已说)

所以它不是一个可以直接赋值的变量

同时,数组在内存中是连续存储的,直接赋值不会自动处理数组中每个元素的复制

所以如果你想copy数组,你可以用循环、也可以用memcpy,之前已经提到


栈与堆的区别

  1. 栈(Stack)
    • 栈内存是自动管理的,通常用于存储局部变量函数调用的上下文
    • 当函数返回时,栈上的内存会被自动释放,局部变量的生命周期结束
  2. 堆(Heap)
    • 堆内存是手动管理的,适合存储动态大小的数据结构
    • 动态分配的内存不会在函数返回时自动释放,直到程序显式调用free(在C中)

栈的大小通常是有限的,具体大小取决于操作系统和编译器的设置。如果栈空间不足,可能会导致栈溢出(stack overflow)

//用了vs就知道了,老是栈溢出

同时,栈内存的分配和释放速度非常快,因为它只涉及指针的移动,而不需要复杂的内存管理


正是由于函数的局部变量在栈上分配内存的,当函数返回时,这些局部变量的内存会被自动释放(实际上是通过移动栈指针来实现的,而不是逐个清理)

但是动态分配的内存不会在函数返回时自动释放,直到程序显式调用free(在C中)

动态分配提供的内存是在堆上分配的,而堆内存的生命周期是由程序员控制的。所以为了避免内存泄漏,还是希望你在不再需要这块内存时显式地释放它

//如果你对一个数组已经初始化了,它就成为了一个静态变量,那么就不要再对它进行动态分配了,会出问题的

届ける言葉を今は育ててる
最后更新于 2024-11-16