Bonjour à tous,
Cela fait un moment que je n'ai pas touché au C, le trouvant un peu trop bas niveau à mon goût, je m'y suis tous de même remis.
J'ai donc réalisé un petit programme ayant pour rôle d'associer à un mot un "token" sur lequel je ferais des traitement plus tard. Malheureusement, la mémoire se rebelle et ne veut pas se laisser manipuler :-°

Je m'explique : j'ai crée une structure de données SymbolTable définie dans symbolTable.h.
Son rôle est d'attribuer un mot à un token.
J'ai crée 2 fonctions, l'une pour allouer la mémoire pour la structure allocate_Symbol_Table_Memory( SymbolTable** symbolTable ) et une pour ajouter un couple add_Symbol( SymbolTable** symbolTable, const int size, char* symbol, char* token ).
Jusque là tout fonctionne l'allocation se passe parfaitement, malheureusement je ne peux pas accéder aux zones de mémoires alloués dans mes fonctions, ça plante à l'exécution. En revanche, si je tente d'y accéder à partir de mon main aucun problème.

Comme un code parle mieux que des explications, voici mon code :
main.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
#include "symbolTable.h"
 
int main( void ) {
	SymbolTable *symbolTable = NULL;
 
	int size = allocate_Symbol_Table_Memory( &symbolTable );
	//si je tente de modifier dans le main, ça fonctionne
	symbolTable[0].symbol = "";
	//add_Symbol( &symbolTable, size, "if", "<cond>" );
 
	return EXIT_SUCCESS;
}
symbolTable.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef __SYMBOL__TABLE__
#define __SYMBOL__TABLE__
 
//taille de la table des symboles
#ifndef SYMBOL_TABLE_SIZE
	#define SYMBOL_TABLE_SIZE 5
#endif
 
//un symbole est associé à un token, utilisé plus tard pour la construction de l'arbre abstrait de données
typedef struct SymbolTable SymbolTable;
struct SymbolTable
{
	char* symbol;
	char* token;
};
 
//alloue un emplacement mémoire nécessaires pour que la table des symboles puisse fonctionner correctement
int allocate_Symbol_Table_Memory( SymbolTable** symbolTable );
//ajoute un couple (symbole, token) dans la table des symboles
int add_Symbol( SymbolTable** symbolTable, const int size, char* symbol, char* token );
 
#endif
symbolTable.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdlib.h>
#include <stdio.h>
#include "symbolTable.h"
 
//alloue la mémoire nécessaire pour la Table des Symboles
//utilise la constante SYMBOL_TABLE_SIZE définie dans symbolTable.h
int allocate_Symbol_Table_Memory( SymbolTable** symbolTable )
{
	int i = 0;
	*symbolTable = (SymbolTable*)calloc(SYMBOL_TABLE_SIZE, sizeof(SymbolTable));
	if( *symbolTable == NULL )
	{
		fprintf(stderr, "Impossible d'allouer la table des symboles.");
	}
	//pour le test
	printf( "%s", symbolTable[0]->symbol );
	//ça plante ici, dès que je veux accéder au contenu de symbolTable[i]->symbol ou symbolTable[i]->token
	while( i != SYMBOL_TABLE_SIZE )
	{
		symbolTable[i]->symbol = "";
		symbolTable[i]->token = "";
		i++;
	}
	return SYMBOL_TABLE_SIZE;
}
 
//ajoute un couple (symbole, token) dans la table des symboles
//retourne -1 si la table des symboles est pleine
//retourne l'indice auxquels le couple a été ajouté si tout s'est bien passé
int add_Symbol( SymbolTable** symbolTable, const int size, char* symbol, char* token )
{
	int i = 0;
	//on parcourt la table tant qu'on est pas arrivé au dernier élément et qu'il y a un symbole à l'indice
	while( (i != size) && (symbolTable[i++]->symbol == "") );
	if( i == size )
	{
		fprintf(stderr, "Impossible d'ajouter un symbole dans la table des symboles.");
		return -1;
	}
	symbolTable[i]->symbol = symbol;
	symbolTable[i]->token = token;
	return i;
}
Voilà si quelqu'un a une petite idée je lui serais très reconnaissant, ça doit sans doute être une erreur bête mais je ne la vois pas.
Et au passage tout commentaire sur le code, sur des améliorations et optimisations sont les bienvenues.

Merci d'avance