Je veux créer des codes qui scannent les mots et les imprimer en utilisant un tableau de pointeurs, j'ai donc créé ce code. Mais quand je l'implémente, cela fait un core dump. Pourquoi ce code rend le core dumpé et comment y remédier? Ai-je tort de créer du code?
Alors s'il vous plaît, expliquez-moi merci d'avoir lu ma question.
#include <stdio.h>
#include <string.h>
int main(void)
{
char*pch[5];
int i;
for(i=0; i<5; i++)
{
printf("enter word: ");
scanf("%s", pch[i]);
}
for(i=0; i<5; i++)
{
printf("%s\n", pch[i]);
}
return 0;
}
4 Réponses :
Vous ne pouvez pas simplement allouer les pointeurs:
char pch[5][100];
Vous devez allouer de la mémoire pour vos chaînes:
char*pch[5];
"Vous ne pouvez pas simplement allouer les pointeurs": dit-on à tort, le programme n'alloue pas les pointeurs, il leur définit simplement un tableau. Que diriez-vous de proposer également scanf ("% 99s", pch [i]); pour éviter UB si le mot lu est trop long? que diriez-vous également de vérifier scanf renvoie 1 pour gérer les EOF prématurés?
@bruno: En fait, cette partie est correctement dite. Dans char * pch [5] , il y a cinq pointeurs, et cette déclaration est une définition qui leur alloue de l'espace. Il n'alloue pas d'espace pour que les pointeurs pointent, mais il alloue de l'espace pour les pointeurs eux-mêmes.
@EricPostpischil pour moi la phrase est très déroutante, il faut être claire et sans ambiguïté, c'est juste un libellé. Notez également que le mot «allouer» dérange beaucoup de gens lorsqu'il s'agit d'une variable locale (plutôt qu'une allocation dynamique dans le tas). juste mes 2 cents
Parce que vous n'allouez pas d'espace pour le tableau de pointeurs pch que vous avez défini ci-dessus. À propos de Strdup
char * pch [5]; définit un tableau de cinq pointeurs vers char . Il n'attribue aucune valeur à ces pointeurs et n'alloue aucun espace pour qu'ils pointent.
Dans scanf ("% s", pch [i]); , scanf doit recevoir un pointeur vers un espace déjà alloué. Il n'allouera pas d'espace et ne changera pas pch [i] . Étant donné qu'aucune valeur n'a été attribuée à pch [i] , le comportement de cette instruction n'est pas défini. Généralement, scanf reçoit une mauvaise adresse, ce qui provoque une erreur d'accès à la mémoire.
Pour résoudre ce problème, vous pouvez soit définir un tableau de tableaux de char code >:
char *pch[5];
for (int i = 0; i < 5; ++i)
pch[i] = malloc(256);
ou vous pouvez allouer de l'espace à utiliser avec chaque pointeur:
char pch[5][256];
L'un ou l'autre vous permettra poursuivez votre programme, mais ils ne conviennent qu'à des fins d'apprentissage précoce. Au fur et à mesure que vous procédez à la programmation, vous apprendrez à limiter ce que scanf lit pour qu'il reste dans l'espace prévu à cet effet, comment tester la valeur de retour de malloc pour les problèmes , et comment traiter l'entrée lorsqu'elle peut dépasser une quantité d'espace fixe.
Voir mes commentaires après chaque section de votre code.
pch[0] = (char*)malloc(sizeof(char) * 10); ... and so on...
pch est un tableau de 5 pointeurs de caractères. chaque pointeur dans le pch pointe vers une valeur de garbage .
char*pch[5]; char str_0[10]; char str_1[10]; char str_2[10]; char str_3[10]; char str_4[10]; pch[0]=str_0; pch[1]=str_1; ...... and so on ...
ici vous essayez d'enregistrer la chaîne d'entrée à une adresse invalide (le adresse des ordures ). cette adresse n'est pas la vôtre. si vous souhaitez enregistrer la chaîne d'entrée, faites-lui de la place. Comment?
avec malloc sur le tas ou sur la pile. comment allouons-nous sur la pile? voir ci-dessous:
En supposant que vos chaînes contiennent au maximum 9 caractères et un pour le '\ 0', alors:
for(i=0; i<5; i++)
{
printf("enter word: ");
scanf("%s", pch[i]);
}
vous pouvez allouer les chaînes entières tableau sur le tas:
char*pch[5];
Dans le cas de malloc, vous devez libérer tous les tampons (en appelant free () à la fin)
Vous avez un tableau de pointeurs, mais où pointent réellement les pointeurs?
Pourquoi cette question est-elle étiquetée
c ++?