为什么我无法管理~382MB的内存?

时间:2013-05-14 13:32:04

标签: c pointers memory-management

目标:管理unsigned long tomBOLA[5][10000000];

$top给了我:

top - 14:05:35 up  4:06,  4 users,  load average: 0.46, 0.48, 0.44
Tasks: 182 total,   1 running, 180 sleeping,   1 stopped,   0 zombie
Cpu(s): 14.4%us,  2.4%sy,  0.0%ni, 82.5%id,  0.6%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3092064k total,  1574460k used,  1517604k free,   168944k buffers
Swap:  1998840k total,        0k used,  1998840k free,   672756k cached

程序有一个大小为(5 * 10000000)* 8bytes = 382MB的malloc,然后用0填充并读取存储在tomBOLA中的内容:

long int **tomBOLA;

if((tomBOLA=(long int **)malloc(5))==NULL){ /*MALLOC()*/
    printf("\n\tMEMORY ERROR-1");
    exit(1);
}
for(i=0;i<5;i++){
    if((tomBOLA[i]=(long int *)malloc(10000000*sizeof(long int)))==NULL){
        printf("\n\tMEMORY ERROR-2");
        exit(1);
    }
}                                          /*MALLOC()*/
for(i=0;i<5;i++){
    for(j=0;j<10000000;j++){
        tomBOLA[i][j]=0;
    }
}                                         /*FILL WITH 0s before using*/
for(i=0;i<5;i++){
    for(j=0;j<10000000;j++){
        printf("%ld ",tomBOLA[i][j]);
    }
printf("\n\n\n\n\n");
}                                         /*CONTROL OF 0s*/

gdb给出

Program received signal SIGSEGV, Segmentation fault.
_int_malloc (av=<value optimized out>, bytes=<value optimized out>) at malloc.c:4708
4708    malloc.c: No such file or directory.
    in malloc.c
(gdb) bt
#0  _int_malloc (av=<value optimized out>, bytes=<value optimized out>) at malloc.c:4708
#1  0x001dfd4c in *__GI___libc_malloc (bytes=40000000) at malloc.c:3660
#2  0x0804ca86 in main ()
(gdb) 

关于记忆,我在做什么或做错了什么?

3 个答案:

答案 0 :(得分:7)

此:

tomBOLA=(long int **)malloc(5))

是错误的,它分配5个字节,当你把它当作五个指针的数组(大概需要20个字节)时会导致立即缓冲区溢出。你的意思是:

tomBOLA = malloc(5 * sizeof *tomBOLA);

获得指向unsigned long的五个指示。

请注意,动态执行此操作毫无意义,只需说出来就更简单了:

unsigned long *tomBOLA[5];

此外:

  1. Get rid of the casts of malloc()'s return value
  2. 停止使用魔法常量(上面的解决方案会使5在其余代码中消失,因为您可以使用sizeof tomBOLA / sizeof *tomBOLA代替5)。

答案 1 :(得分:2)

你的第一个malloc错了。你需要为指针分配足够的内存。

if((tomBOLA=(long int **)malloc(5))==NULL){ /*MALLOC()*/

应该是

if((tomBOLA=(long int **)malloc(5 * sizeof *tomBOLA))==NULL){ /*MALLOC()*/

sizeof *tomBOLA在这种情况下与sizeof(long int *)相同,但它遵循SomeType *p = malloc(sizeof *p))的一般模式

答案 2 :(得分:0)

你可能已经有了这个内存,但是没有在malloc调用试图给你的连续块中。