Quelle est la bonne façon d’initialiser char**
? J’obtiens une erreur
Uninitialized pointer read (UNINIT)
lorsque j’essaie :
char **tab = NULL;
ou
char **tab = { NULL };
Quelle est la bonne façon d’initialiser char**
? J’obtiens une erreur
Uninitialized pointer read (UNINIT)
lorsque j’essaie :
char **tab = NULL;
ou
char **tab = { NULL };
Le programme suivant montre l’initialisation d’un tableau de chaînes de caractères en C.
#include <stdio.h>
const char * tab[] = {
"Str1",
"Str2",
"Str3",
};
#define tab_size (sizeof (tab) / sizeof (const char *))
int main ()
{
int i;
for (i = 0; i < tab_size; i++) {
printf ("%d: %s\n", i, tab[i]);
}
return 0;
}
Il affiche le résultat suivant :
0: Str1 1: Str2 2: Str3
Bonjour, ça marche ! Mais j’ai une question, pourquoi dois-je utiliser #define tab_size
ici ? J’ai essayé avec : int tab_size
, et mon application se plante, je suis débutant en C et je ne comprends pas ce comportement - #define
au lieu d’une simple variable int
. Merci de votre aide.
#define
est juste une question de style. Dans la fonction main
vous pourriez facilement définir une autre variable int et l’assigner à sizeof (array) / sizeof (const char *)
Il est possible de faire char **tab;
, char **tab = NULL
, ou char **tab = {NULL}
mais pour l’initialiser, il faut utiliser malloc :
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(){
// allouer de l'espace pour 4 pointeurs sur des chaînes de caractères
char **tab = (char**)malloc(4*sizeof(char*));
int i = 0;
//allouer de l'espace pour chaque chaîne de caractères
//alloue ici 40 octets, ce qui est largement suffisant pour les chaînes de caractères.
for(i = 0; i < 4; i++){
printf("%d\n", i);
tab[i] = (char*)malloc(40*sizeof(char));
}
//leur attribuer une chaine
sprintf(tab[0], "hello alex");
sprintf(tab[1], "hello bob");
sprintf(tab[2], "hello emily");
sprintf(tab[3], "hello camily");
// Afficher le tableau
for(i = 0; i < 4; i++){
printf("Ligne #%d(taille: %lu): %s\n", i, strlen(tab[i]),tab[i]);
}
//Libérer chaque chaîne de caractère
for(i = 0; i < 4; i++){
free(tab[i]);
}
//libérer enfin la première chaîne de caractère
free(tab);
return 0;
}