函数调用期间的内存管理

Posted

技术标签:

【中文标题】函数调用期间的内存管理【英文标题】:Memory management during function call 【发布时间】:2014-05-27 09:00:24 【问题描述】:

我正在编写一个涉及在 C 中处理维度为 [101]X[101] 的二维数组的代码。但是我在给定时间点使用的内存方面受到限制。

void manipulate(int grid_recv[101][101])

     //Something


void main()

   int grid[101][101];
   manipulate(grid);

假设我在 main() 中创建了一个数组 grid[101][101],然后将其传递给另一个函数进行操作。现在函数 manipulate() 是否将整个矩阵 grid 复制到 grid_recv 中,即通过这种传递,我是否使用了两倍的内存量(即 grid 的两倍)?

【问题讨论】:

【参考方案1】:

没有。在 C 中,数组不能作为参数传递给函数。

你实际上做的是创建一个指向数组的指针。所以你使用的额外内存只有创建的那个指针的大小。

【讨论】:

所以基本上你的意思是,即使我收到的数组是 grid_recv[101][101] (而不是 int ** grid_recv),我仍然收到一个指针?那么数组的大小是如何并入图片的呢? @Dubby 是的,我的意思是在 C 中无法将数组本身作为参数传递。我不确定你在问什么,但如果你需要数组的大小函数,那么你需要将它作为一个额外的参数传递。 谢谢!这回答了我的问题 :) 最后一个问题:我如何决定何时使用 int ** arr 表示和 int arr[n][n] 表示来初始化二维数组? C 还允许可变大小的数组初始化吗? @Dubby 在您的示例中,您有一个指向二维数组的指针。 int grid_recv[101][101] == int (*grid_recv)[101]int** arr 是一个指向 int 的指针。 我的错!谢谢! @自己。但是我什么时候使用 grid_recv[101][101] 或 (*grid_recv)[101] ?通过显式指针数组 ((*grid_recv)[101]) 接收数组而不是标准数组表示法有什么好处?

以上是关于函数调用期间的内存管理的主要内容,如果未能解决你的问题,请参考以下文章

多线程 - 如何在 python 中的线程调用期间控制函数的打印语句

内存管理:栈(stack) 和 栈溢出

Linux 内核 内存管理munmap 系统调用源码分析 ② ( do_munmap 函数执行流程 | do_munmap 函数源码 )

Linux内存管理:函数调用图谱-1

Linux 内核 内存管理mmap 系统调用源码分析 ⑤ ( mmap_region 函数执行流程 | mmap_region 函数源码 )

Linux 内核 内存管理mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )