web-dev-qa-db-fra.com

Allocation dynamique de mémoire pour les tableaux de pointeurs

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]);
19
user2826534

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.
19
dasblinkenlight
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);
9
Gangadhar
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);
}

...
5
alk