0

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

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

int bigarray[rows][columns],

其中行介于 2^4 和 2^50 之间,列介于 4 和 50 之间。

4

3 回答 3

2

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

下面是链接Massif: a heap profiler,希望对你有帮助。

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

于 2013-06-04T13:14:09.640 回答
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;
于 2013-06-04T13:11:00.253 回答
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 的大小相当不错

于 2013-06-04T13:21:44.733 回答