结构数组的内存分配问题?

时间:2011-05-13 11:58:32

标签: c

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时程序退出了?还有其他方法可以达到这个目的吗?

4 个答案:

答案 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)

您可能已达到流程的内存使用限制。

操作系统限制了可以在单个应用程序中分配的内存量。

有很多方法可以解决这个问题,但这取决于您的需求:

  1. 将工作拆分为部分:每次分配少量内存,使用它,然后重用(或重新分配)内存以用于下一部分
  2. 使用多个流程拆分工作,这些流程可以共享信息以共享工作
  3. 实现自己的分页机制:创建一个或多个文件来存储内存并将其用作内存
  4. 更多...
  5. 请注意每个解决方案的开销