0

プロシージャへのポインタへのポインタを渡そうとしていますが、関数に渡すと完全に正常に動作しますが、毎回セグメンテーション違反が発生します。この質問のように、 C がポインターへの配列に対して自動的に行う強制と関係があると思います: C のポインターにポインターを渡します

しかし、私はそれを修正する方法がわかりません。

コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

void creer_matrice(int nbCol, int nbLigne, char **matrice)
{
     int i,j;

     matrice = calloc( nbCol, sizeof(char*));

     if( matrice == NULL ){

         printf("Allocation impossible");
         exit(EXIT_FAILURE);

     }

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

          matrice[i] = calloc (nbCol, sizeof(char*));

            if( matrice[i] == NULL ){

             printf("Allocation impossible");
             exit(EXIT_FAILURE);

             }
      }


      /* Remplissage de test*/
     for(i = 0; i < nbLigne; i++){

           for(j = 0; j < nbCol; j++){
             matrice[i][j] = 'I';
           }

     }

   //return matrice;
}


int main(){
    int i,j;

    char **matrice;

    creer_matrice(8,6,matrice);

    //matrice = creer_matrice(8,6);

      for(i = 0; i < 6; i++){
         for(j = 0; j < 8; j++){
            printf("%c ",matrice[i][j]);
         }
      printf("\n");
      }

}

誰かが私が間違っている場所とそれを解決する方法を教えてもらえますか?

4

2 に答える 2

0

この行を変更します。

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

      matrice[i] = calloc (nbCol, sizeof(char*));

に:

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

      matrice[i] = calloc (nbLinge, sizeof(char));

または、イベントの改善:1つのステートメントでマトリックス全体にメモリを割り当てます。

于 2013-02-03T13:56:15.333 に答える
0
matrice = calloc( nbCol, sizeof(char*));

ここでは、マトリックスに十分なメモリを割り当てていません。マトリックスのサイズとそれに格納するタイプに応じて、メモリを割り当てる必要があります。

matrice = calloc(nbCol * nbLigne, sizeof(int));

そして削除します

matrice[i] = calloc (nbCol, sizeof(char*));

システムコールをできるだけ少なくするようにしてください。1回の呼び出しですべてのマトリックスを割り当てることができる場合は、それを実行します。関数の開始時に割り当てられる正確なサイズはすでにわかっています。

終了したら、割り当てられたメモリを解放することを忘れないでください。

free(matrice);
于 2013-02-03T13:55:44.057 に答える