2017-11-22 18 views
0

0-xの範囲の乗算表を格納するC関数を記述しようとしています。私が書いた関数には、テーブルの最初の2行か3行しか格納されていないバグがあり、その関数は決して値を返すことはなく、私は非常に混乱しています。ここで掛け算表の問題

void makeTable (int x) { 
int** table = malloc(x * sizeof(int*)); 
int i; 
int q; 
int* ptr; 
for(i = 0; i <= x; i++){ 
    ptr = calloc(x, sizeof(int)); 
    for(q = 0; q <= x; q++){ 
     ptr[q] = (i * q); 
    } 
    table[i] = ptr; 
} 
return table; 

}

+2

サイズがxの配列の場合、最後にアクセス可能な要素のインデックスは 'x-1'です –

+1

関数は' int ** 'を返すときに' void'と宣言します。コンパイラの警告がこれを捕らえていたはずです。 –

答えて

1

あなたが割り当てられていないメモリにアクセスします。それは未定義の動作です。

xの要素が正しくないと考えると、x+1となります。

for(q = 0; q < x; q++){ 
     ptr[q] = (i * q); 

同様に外側のループも同じです。

for(i = 0; i < x; i++){ 

また、void(未定義の動作)と宣言されている関数からの戻りはほとんどありません。 malloccallocの戻り値をチェックしないと問題があります。関数を記述するために

だから、正しい方法は、あなたがfreeを使用して、これらすべての動的に割り当てられたメモリを解放するためのロジックを追加する必要がどこかに、このプログラムでも

int** makeTable (int x) { 
    int** table = malloc(x * sizeof *table); 
    if(!table) 
    { 
     fprintf(stderr,"Error in mem alloc"); 
     exit(1); 
    } 
    for(size_t i = 0; i < x; i++){ 
     int * ptr = calloc(x, sizeof *ptr); 
     if(!ptr) 
     { 
      fprintf(stderr,"Error in mem alloc"); 
      exit(1); 
     } 
     for(size_t q = 0; q < x; q++){ 
      ptr[q] = (i * q); 
     } 
     table[i] = ptr; 
    } 
    return table; 
} 

だろう。