分析C程序的内存使用情况

时间:2013-06-04 12:55:26

标签: c arrays memory memory-management memory-leaks

我知道有很多类似的问题(我不确定是否可能重复)但我的问题非常具体。我正在Windows和Unix中运行C程序,我遇到了分段错误(核心转储) error.I知道那个错误的来源。这是因为我有时会通过分配一个大的整数数组来使用大量的内存。我的数组的大小每次都不同但我不能(大多数时候我不想)使用动态分配内存。

我想要的是找到一种方法或工具来分析我的C程序的内存使用情况,以便设置对该数组的大小或我所做的任何其他大内存分配的限制。更具体的说吧假设该数组的大小介于4 *(2 ^ 4)字节和4 *(2 ^ 50)字节之间。最小值只有64个字节,但最大值是一个巨大的值。我怎样才能知道我的内存有多少程序需求和设置的适当限制是什么? 我定义了一个这样的数组:

int bigarray[rows][columns]

其中行在2 ^ 4和2 ^ 50之间,列在4到50之间。

3 个答案:

答案 0 :(得分:1)

从堆中获取内存(malloc()和朋友)而不是使用堆栈。堆允许更大的分配。

int *bigarray = malloc(sizeof(int)*rows*columns);

/* to access row r, column c */
bigarray[r*columns+c] = 42;
/* equivalent method to access row r, column c */
*(bigarray+r*columns+c) = 42;

答案 1 :(得分:1)

您好,您可以使用工具valgrind来检查内存消耗以及内存泄漏。

以下是Massif: a heap profiler的链接,希望对您有帮助。

http://valgrind.org/docs/manual/ms-manual.html

答案 2 :(得分:0)

计算(理论上)内存消耗:

printf("%d MB", (rows*columns*sizeof(int))/1024/1024);

你将不得不使用一种新的/ malloc方法来充分利用它(当然比你当前的堆栈方法更多),即如果你使用:

int *bigarray= new int[columns*rows];

然后以

的形式访问它
val= bigarray[ x*columns + y];  // instead of bigarray[x][y];

有了这个,在现代平台(Windows,Linux等)和32位程序上,你可以期待相当不错的尺寸为500 - 1000 MB