int unsigned long size=(atoi(argv[2]))+1;
printf("\nthe size is %lu",size);
printf("\n am here 1");
if( (what_if_var=malloc((size)*sizeof(what_if)))== NULL)
{
exit( -1 );
}
if((temp_var =malloc((size)*sizeof(what_if)))== NULL)
{
exit( -1 );
}
当我给argv[2]
367000时,内存分配工作正常,但是当我给argv[2]
超过380000时程序退出了?还有其他方法可以达到这个目的吗?
答案 0 :(得分:1)
这些细节取决于malloc的实现,我认为你不能改变它们。也许增加堆的大小可能有所帮助。
答案 1 :(得分:1)
[编辑]有没有办法分配大量的字节?
购买更多内存。
找到另一种可以处理较小数据块的算法。
答案 2 :(得分:0)
正如Shickadance先生所说, perror()应该有助于追踪 malloc()失败的原因。此代码演示了用法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N_ARRAYS 2
int main (int argc, char **argv)
{
char * my_arrays[N_ARRAYS];
size_t nbytes = 1024;
int i;
if (argc>1) {
nbytes = atoi(argv[1]);
if (nbytes == 0) {
fprintf(stderr, "Parse error for input \"%s\"\n", argv[1]);
exit(EXIT_FAILURE);
}
}
for (i=0; i<N_ARRAYS; i++) {
my_arrays[i] = malloc(nbytes);
if (!my_arrays[i]) {
perror("malloc");
exit(EXIT_FAILURE);
} else {
printf("[%i] Successfully allocated %i bytes on the heap\n", i, nbytes);
}
}
return 0;
}
您可以传入要分配为argv [1]的字节数。
在我的Linux机器上,我可以愉快地为该进程分配最多2GB的内容,这是我机器上的默认虚拟地址空间大小。如果我试图超过该限制, malloc()将失败,perror()会告诉我原因:
# Allocate two 1024MB arrays
tom@gibbon:~/src/junk/stackoverflow$ ./a.out $((1024*1024*1024))
[0] Successfully allocated 1073741824 bytes on the heap
[1] Successfully allocated 1073741824 bytes on the heap
# Allocate two 1500MB arrays
tom@gibbon:~/src/junk/stackoverflow$ ./a.out $((1500*1024*1024))
[0] Successfully allocated 1572864000 bytes on the heap
malloc: Cannot allocate memory
答案 3 :(得分:0)
您可能已达到流程的内存使用限制。
操作系统限制了可以在单个应用程序中分配的内存量。
有很多方法可以解决这个问题,但这取决于您的需求:
请注意每个解决方案的开销