1

ビット配列へのポインターの配列を作成したい。ポインタをテストするためにこの func2 を作成しましたが、関数外のビット配列の要素にアクセスしようとすると、セグ フォールトが発生します。私は何を間違っていますか?

int func2(int i,  int* bit_array){

  int j;

  for(j = 0; j< i; j++)
    bit_array[j] = malloc(sizeof(int) * i);  

  for(j = 0; j< i; j++)    
   bit_array[j] = 0;

  return 1;
}

int main(){

 int** bit_root;
 bit_root = malloc(sizeof(int *) * 5);

 func2(5, bit_root);

 int n;
 for(n = 0; n < 5; n++)
   printf("%d ", bit_root[0][n]); //error

 printf("\n");

 return 0;
}
4

2 に答える 2

1

関数に間違った配列を送信していますfunc2func2する必要があります:

int func2(int i,  int** bit_array){

  int j,k;

  for(j = 0; j< i; j++)
    bit_array[j] = malloc(sizeof(int) * i);  

  for(j = 0; j< i; j++)
    for(k = 0; k< i; k++)  
       bit_array[j][k] = 0;

  return 1;
}

int main(){

 int** bit_root;
 bit_root = malloc(sizeof(int *) * 5);

 func2(5, bit_root);

 int n;
 for(n = 0; n < 5; n++)
   printf("%d ", bit_root[0][n]); //error

 printf("\n");

 return 0;
}
于 2013-11-03T20:36:10.503 に答える
0

以下の行では、bit_array の各要素に対して int の配列にメモリを割り当て、int 配列へのポインターを bit_array 要素に割り当てます。

for(j = 0; j< i; j++)
  bit_array[j] = malloc(sizeof(int) * i);  

ただし、ここでは bit_array 要素にゼロを割り当てます。したがって、メモリをまったく割り当てなかったかのように、ポインターをゼロに書き換えます。

for(j = 0; j< i; j++)    
  bit_array[j] = 0;

これを修正するには、この最後のブロックを次のコードに置き換えます。

int k;
for(j = 0; j< i; j++)    
  for(k = 0; k < i; k++)
    bit_array[j][k] = 0;

ここで、最初のループでは int 配列 (bit_array[j]) へのポインターの配列を反復処理し、内側のループでは int の配列 (bit_array[j][k]) を反復処理します。これらの変更には、func2 定義の変更が必要です。2 番目のパラメーターは、単なるポインターではなく、int へのポインターへのポインターである必要があります。コンパイラの警告を取り除くのに役立ちます。何が起こっているかを明確に確認するには、次のコードを使用できます。

int k, *int_array = NULL;
for(j = 0; j< i; j++)
{ 
  int_array = bit_array[j]; // get the pointer to int array   
  for(k = 0; k < i; k++)
    int_array[k] = 0; // assign values to int array
}

そして、内部配列と bit_array の両方のために、これらすべてのメモリを解放することを忘れないでください。

于 2013-11-03T20:30:42.083 に答える