2014-10-19 3 views
0

У меня есть проблема, пытаясь использовать char ** в структуре на языке C.Char ** в структуре в C: ошибка сегментации 11

Цель моего кода - сохранить историю строк. Структура имеет 2 переменные:

codeJuste, представляющий собой цепочку символов NB_PION. Коды, которые представляют собой массив случаев NB_COUPMAX. Каждый случай хранит код, который является строкой символов NB_PION.

Я пытаюсь записать в каждый случай кодовПроекты, но у меня есть ошибка ошибки сегментации. благодарю вас за помощь за попытку помочь мне (извините за мой английский, я французский).

Вот мой код тестирования:

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

#define NB_PION 4 
#define NB_COULEUR 4 
#define NB_COUPMAX 6 

//Définition d'une structure 
typedef struct _Partie{ 
    char* codeJuste; 
    char** codesProposes; 
} Partie; 


int main (int argc,char** argv[]){ 
    Partie maPartie; 

    maPartie.codeJuste = malloc((NB_PION+1) * sizeof(char)); 
    strcpy(maPartie.codeJuste,"AAAA"); 

    maPartie.codesProposes = malloc(NB_COUPMAX * ((NB_PION + 1) * sizeof(char))); 
    strcpy(maPartie.codesProposes[0],"BBBB"); 
    strcpy(maPartie.codesProposes[1],"CCCC"); 

    printf("1:%s \n",maPartie.codeJuste); 
    printf("2:%s \n",maPartie.codesProposes[0]); 
    printf("3:%s \n",maPartie.codesProposes[1]); 
} 
+0

Где вы получите сообщение об ошибке (что линия) и что это говорит именно? –

+0

o_weisman: Я получаю сообщение об ошибке при запуске программы после компиляции. Ошибка: «Ошибка сегментации: 11» – clmt974

ответ

2

Изменить это:

maPartie.codesProposes = malloc(NB_COUPMAX * ((NB_PION + 1) * sizeof(char))); 

Для этого:

maPartie.codesProposes = malloc(NB_COUPMAX * sizeof(char*)); 
for (i=0; i<NB_COUPMAX; i++) 
    maPartie.codesProposes[i] = malloc((NB_PION+1) * sizeof(char)); 

И не забудьте освободить все на более позднем этапе выполнение вашей программы:

for (i=0; i<NB_COUPMAX; i++) 
    free(maPartie.codesProposes[i]); 
free(maPartie.codesProposes); 
+0

Спасибо, но это тоже не работает. У меня такая же ошибка при запуске программы: Ошибка сегментации: 11. – clmt974

+0

@ clmt974: Ну, это отлично работает для меня ... Я «пропустил« [i] '» раньше, возможно, вы попытались его использовать прежде чем я его исправил ... –

+0

Спасибо, я попробовал, прежде чем вы измените. На самом деле, ваш код работает :) еще раз спасибо. – clmt974

1

Изменение нравится это:

typedef struct _Partie{ 
    char *codeJuste; 
    char (*codesProposes)[NB_PION+1]; 
} Partie; 


maPartie.codesProposes = malloc(NB_COUPMAX * sizeof(char [NB_PION+1])); 
+0

Большое спасибо. Он отлично работает BLUEPIXY !! Не могли бы вы объяснить мне разницу между вашим решением и моим старым? – clmt974

+0

@ clmt974 Вы должны быть похожими на barak manos. Если вы хотите использовать двойной указатель. 'MaPartie.codesProests [0]' - это указатель в этом случае, но это нужно указывать на область 'char [NB_PION + 1]'. мой код должен только обеспечить размер области просто потому, что в случае моего пути указатель 'codesPropos' на' char [NB_PION + 1] '. – BLUEPIXY

Смежные вопросы