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

分析C程序的内存使用情况,c,arrays,memory,memory-management,memory-leaks,C,Arrays,Memory,Memory Management,Memory Leaks,我知道有很多类似的问题(我不确定是否可能重复),但我的问题足够具体。我在Windows和Unix中运行一个C程序,遇到一个分段错误(内核转储)错误。我知道错误的来源。这是因为我有时会通过分配一个大整数数组来使用大量内存。数组的大小每次都不同,但我不能(大部分情况下我不想)使用动态内存分配 我想要的是找到一种方法或工具来分析我的C程序的内存使用情况,以便对该数组的大小或我进行的任何其他大内存分配设置一个限制字节。最小值只有64字节,但最大值是一个巨大的值。我如何知道我的程序需要多少内存,以及设置的

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

我想要的是找到一种方法或工具来分析我的C程序的内存使用情况,以便对该数组的大小或我进行的任何其他大内存分配设置一个限制字节。最小值只有64字节,但最大值是一个巨大的值。我如何知道我的程序需要多少内存,以及设置的适当限制是什么? 我定义了如下数组:

int-bigarray[行][列]

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

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

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;

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

下面是指向Massif:a heap profiler的链接,希望对您有所帮助

计算(理论)内存消耗:

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的大小,所以您使用的是VLA,对吗?然后只需检查溢出的
sizeof(array)>已知的\u限制\u堆栈
2^50是PB。祝你好运@RichieHindle我会将限制设置为大大小于2^50,可能2^102^50甚至比MAX int(32位)更大,可以
[]
甚至处理吗?printf(“%d\n”,sizeof(bigarray));如上所述。至于hwat可能是适当/有用的限制,取决于平台(Windows、Linux等)。此外,您还可以使用malloc/新方法从程序中挤出更多的大小。如果我使用像valgrind这样的工具,我更喜欢使用在windows上运行的工具。您有什么建议吗?抱歉@Dchris,我现在还没有在windows中进行
C
编程的经验。:)@下面的Dchris链接可能对您有所帮助。从堆中分配将使更大的分配成为可能?对于500-1000MB的大小,它将以多快的速度运行?您所说的“它将以多快的速度运行”是什么意思?跑什么?速度取决于您对它所做的操作(读取、计算、交叉搜索),以及处理器和内存,以及计算机的繁忙程度(分配给其他任务的内存量)。