0

目的: 管理する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) * 8 バイト = 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) 

メモリについて、私は何をしているのか、間違っていると思いますか??

4

3 に答える 3

7

これ:

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

5 バイトを割り当てているため、5 つのポインターの配列として扱うと、すぐにバッファー オーバーランが発生します (おそらく 20 バイトが必要です)。あなたが意味したのは:

tomBOLA = malloc(5 * sizeof *tomBOLA);

への 5 つのポインターを取得しunsigned longます。

これを動的に実行しても意味がないことに注意してください。次のように言う方が簡単です。

unsigned long *tomBOLA[5];

また:

  1. malloc()の戻り値のキャストを取り除きます。
  2. 魔法の定数の使用を停止します (上記のソリューションでは、代わりに を5使用できるため、コードの残りの部分がなくなります)。sizeof tomBOLA / sizeof *tomBOLA5
于 2013-05-14T13:35:10.410 に答える
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))

于 2013-05-14T13:37:05.360 に答える
0

そのメモリが利用可能である可能性がありますが、malloc 呼び出しが提供しようとしている連続したブロックにはありません。

于 2013-05-14T13:34:10.867 に答える