Struct Char non assigné correctement

J’essaie de faire un type de structure de données de type liste liée, et pour le moment, il ne contient qu’un seul caractère en tant que données, mais je ne peux pas le faire atsortingbuer correctement. Lorsque j’exécute le code suivant:

 #include  #include  #include  #include  #include  FILE* outfile; FILE* infile; int linkedlist_size; struct linked_list { char* data; struct linked_list* next; struct linked_list* previous; }; int main() { outfile = fdopen(STDOUT_FILENO,"w"); infile = fdopen(STDIN_FILENO,"r"); struct linked_list line_buffer; struct linked_list* current = &line_buffer; int linkedlist_size = 0; int input_char; char input_cast; for (input_char = fgetc(infile); (input_char != EOF && input_char != '\n') ;input_char = fgetc(infile)) { input_cast = input_char; current->data = malloc(sizeof(char)); (current->data)[0] = input_cast; linkedlist_size++; current->next = malloc(sizeof(struct linked_list)); current = current->next; printf("\nMy address is: %p",current); printf("\nMy number is: %d",input_char); printf("\nMy char cast is: %c",input_cast); printf("\nMy char is: %s",current->data); } return 0; } 

Compilé avec gcc ll_test.c , exécuté avec ./a.out et utilisant something comme entrée du clavier, j’obtiens la sortie suivante:

 My address is: 0x10558a0 My number is: 115 My char cast is: s My char is: (null) My address is: 0x1055cf0 My number is: 111 My char cast is: o My char is: (null) My address is: 0x1055d30 My number is: 109 My char cast is: m My char is: (null) My address is: 0x1055d70 My number is: 101 My char cast is: e My char is: (null) My address is: 0x1055db0 My number is: 116 My char cast is: t My char is: (null) My address is: 0x1055df0 My number is: 104 My char cast is: h My char is: (null) My address is: 0x1055e30 My number is: 105 My char cast is: i My char is: (null) My address is: 0x1055e70 My number is: 110 My char cast is: n My char is: (null) My address is: 0x1055eb0 My number is: 103 My char cast is: g My char is: (null) 

Ce qui signifie que les lettres vont dans STDIN correctement, sont interprétées correctement (la boucle s’arrête après avoir tapé un \n ) et la dissortingbution est faite correctement, mais l’affectation ne fonctionne pas. Pour ce que cela vaut, j’ai également essayé de faire de linked_list.data un caractère régulier et d’atsortingbuer directement (via current->data = input_cast ) et reçu des résultats similaires (sortie vierge plutôt que (null) , impliquant qu’un \0 était “imprimé” ). Je présume que je ne connais pas bien les structures, mais je ne peux pas comprendre ce que c’est. N’hésitez pas à saisir / comstackr / tester le code à votre guise.

De plus, je suis conscient qu’il ya une fuite de mémoire … c’est un extrait modifié d’un plus grand nombre de codes, de nombreuses fonctionnalités ne sont donc pas une perfection académique. Je voulais juste démontrer le comportement que je recevais.

Merci à tous!

EDIT: Comme indiqué ci-dessous, l’erreur était que j’essayais d’imprimer le caractère de mon nœud actuel APRÈS que je suis passé au nœud vide suivant. Erreur logique stupide de ma part.

Vous devez allouer 2 octets, comme ceci: current->data = malloc(2); Les premiers octets stockeront votre caractère et le deuxième octet stockera le terminateur de chaîne '\0' , après quoi vous pourrez l’imprimer en tant que chaîne. Vous oubliez d’utiliser votre champ précédent, vous pouvez:

  current->next = malloc(sizeof(struct linked_list)); current->next->previous=current; current = current->next; 

Si vous imprimez votre chaîne à partir d’un nouveau nœud, celui-ci n’est pas initialisé au moment de son impression. Déplacez votre ligne current = current->next; déclarations printf ci-dessus.

 printf("\nMy char is: %s",current->data); 

devrait être

 printf("\nMy char is: %c", *(current->data)); 

ou

 printf("\nMy char is: %c", current->data[0]); 

En d’autres termes, le spécificateur de format doit être pour un seul caractère et non pour une chaîne et le pointeur de données doit être déréférencé pour obtenir le caractère. Dans le cas où ce n’est toujours pas clair, une chaîne en C est une suite de caractères terminée par NUL . Vous n’avez qu’un seul caractère et non une chaîne.