Initialiser un tableau de chaine de caractére en C

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;
}