目标:管理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)
关于记忆,我在做什么或做错了什么?
答案 0 :(得分:7)
此:
tomBOLA=(long int **)malloc(5))
是错误的,它分配5个字节,当你把它当作五个指针的数组(大概需要20个字节)时会导致立即缓冲区溢出。你的意思是:
tomBOLA = malloc(5 * sizeof *tomBOLA);
获得指向unsigned long
的五个指示。
请注意,动态执行此操作毫无意义,只需说出来就更简单了:
unsigned long *tomBOLA[5];
此外:
malloc()
's return value。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调用试图给你的连续块中。