Передача указателя на указатель в процедуре на C

Я пытаюсь передать указатель на указатель на процедуру, но каждый раз получаю segfault, а передача его функции работает отлично. Я предполагаю, что это может иметь какое-то отношение к тому, что 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");
      }

}

Может кто-нибудь, пожалуйста, скажите мне, где я не прав и как это решить?


person Prewitt    schedule 03.02.2013    source источник
comment
c-faq.com/ptrs/passptrinit.html   -  person cnicutar    schedule 03.02.2013
comment
Возможно, вы захотите написать свой код с английскими переменными и комментариями.   -  person LtWorf    schedule 03.02.2013
comment
Примечание: в C... нет различия между функцией и процедурой.   -  person Oliver Charlesworth    schedule 03.02.2013
comment
pastebin.com/JMkPpg26   -  person Prewitt    schedule 03.02.2013


Ответы (2)


Измените эти строки:

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

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

To:

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

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

Или событие лучше: выделить память для всей матрицы в одном выражении.

person yattering    schedule 03.02.2013

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

Здесь вы не выделяете достаточно памяти для своей матрицы. Вам нужно выделить память в зависимости от размера вашей матрицы и типа, который вы в ней храните:

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

И удалить

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

Старайтесь делать как можно меньше системных вызовов. Если вы можете выделить всю матрицу за один вызов, сделайте это. Вы уже знаете точный размер, который будет выделен в начале вашей функции.

И не забудьте освободить выделенную память, когда закончите.

free(matrice);
person m0skit0    schedule 03.02.2013
comment
Спасибо за ваш ответ; Я забыл изменить распределение. - person Prewitt; 03.02.2013
comment
Я также думал о размещении в одной строке, но проблема в том, что мне нужно получить к ней доступ как к матрице (например, матрице [i] [j]). - person Prewitt; 03.02.2013
comment
Не беда, одного выделения достаточно. Я предлагаю вам проверить хороший учебник C. - person m0skit0; 03.02.2013
comment
Хорошо спасибо. Как вы думаете, есть ли ошибка в аргументе, который я передаю процедуре? - person Prewitt; 03.02.2013
comment
Нет, все в порядке, но не забудьте освободить память, когда закончите (см. редактирование моего ответа). - person m0skit0; 03.02.2013