J'essaie d'écrire un programme qui lit une série de chaînes à partir d'un fichier texte et les stocke dans un tableau de chaînes, allouant dynamiquement de la mémoire pour chaque élément. Mon plan était de stocker chaque chaîne dans un tableau à l'aide d'un pointeur, puis d'augmenter la taille du tableau au fur et à mesure de la lecture. J'ai du mal à comprendre pourquoi mon code de test ci-dessous ne fonctionne pas. Est-ce une idée réalisable?
char *aPtr;
aPtr =(char*)malloc(sizeof(char));
aPtr[0]="This is a test";
printf("%s",aPtr[0]);
En C, une chaîne est un char*
. Un tableau dynamique de type T
est représenté par un pointeur vers T
, donc pour char*
ce serait char**
, pas simplement un char*
la façon dont vous l'avez déclaré.
Le compilateur a sans aucun doute émis des avertissements à ce sujet. Faites attention à ces avertissements, très souvent ils vous aident à comprendre quoi faire.
Voici comment vous pouvez commencer votre test:
char **aPtr;
int len = 1; // Start with 1 string
aPtr = malloc(sizeof(char*) * len); // Do not cast malloc in C
aPtr[0] = "This is a test";
printf("%s",aPtr[0]); // This should work now.
char *str; //single pointer
Avec cela, vous pouvez stocker une chaîne.
Ranger array of strings
vous avez besoin two dimensional character array
ou sinon array of character pointers
ou sinon double pointer
char str[10][50]; //two dimensional character array
Si vous déclarez comme ceci, vous n'avez pas besoin d'allouer de mémoire car c'est une déclaration statique
char *str[10]; //array of pointers
Ici, vous devez allouer de la mémoire pour chaque pointeur
boucle à travers le tableau pour allouer de la mémoire pour chaque pointeur
for(i=0;i<10;i++)
str[i]=malloc(SIZE);
char **str; //double pointer
Ici, vous devez allouer de la mémoire pour le nombre de pointeurs, puis allouer de la mémoire pour chaque pointeur.
str=malloc( sizeof(char *)*10);
Et puis parcourir le tableau allouer de la mémoire pour chaque pointeur
for(i=0;i<10;i++)
str[i]=malloc(SIZE);
char * aPtr;
est un pointeur sur un caractère auquel vous avez alloué de la mémoire pour contenir exactement 1
personnage.
Faire
aPrt[0] = "test";
vous adressez la mémoire pour ce n caractères et essayez de stocker l'adresse du littéral "test"
à elle. Cela échouera car cette adresse est plus large qu'un caractère.
Un correctif à votre code serait d'allouer de la mémoire pour un pointeur sur un caractère.
char ** aPtr = malloc(sizeof(char *));
aPtr[0] = "test";
printf("%s", aPtr[0]);
Une approche plus élégante et plus robuste serait d'allouer la même chose (ainsi que d'ajouter la vérification d'erreur obligatoire) en faisant:
char ** aPtr = malloc(sizeof *aPtr);
if (NULL == aPtr)
{
perror("malloc() failed");
exit(EXIT_FAILURE);
}
...