5 votes

Pointeurs, tableaux, chaînes de caractères et Malloc en C

Je suis en train d'apprendre les chaînes de caractères, les pointeurs et les tableaux en C. J'ai essayé d'écrire un programme dans lequel un tableau contient trois pointeurs vers des adresses de chaînes de caractères. Tout semble fonctionner mais le programme se comporte bizarrement.

Voici le code :

char** getUserDetails()
    {

    char* host = "localhost";

    char* username = "root";

    char* password = "mypassword";

    // create array for holding pointers to strings

    char *userDetailsHolder[3];

    userDetailsHolder[0] = malloc(sizeof(char)*strlen(host));   
    strcpy(userDetailsHolder[0], host);

    userDetailsHolder[1] = malloc(sizeof(char)*strlen(username));
    strcpy(userDetailsHolder[1], username);

        userDetailsHolder[2] = malloc(sizeof(char)*strlen(password));
        strcpy(userDetailsHolder[2], password);

        return userDetailsHolder;
    }

    int main()
    {

    char** userDetails = getUserDetails();

    printf("Host: %s\nUsername: %s\nPassword: %s\n", userDetails[0], userDetails[1], userDetails[2]);

    printf("Host: %s\nUsername: %s\nPassword: %s\n", userDetails[0], userDetails[1], userDetails[2]);

            return 0;
    }

Sortie : La sortie indique que quelque chose s'est terriblement mal passé.

Host: localhost
Username: root
Password: mypassword
Host: root
Username: localhost
Password: Host: %s
Username: %s
Password: %s

Le premier printf semble fonctionner, mais la seconde contient les mauvaises données. Qu'est-ce que j'ai fait de mal ?

8voto

Blagovest Buyukliev Points 22767

Le problème est que vous renvoyez un pointeur vers un tableau qui se trouve sur la pile. userDetailsHolder est alloué sur la pile et n'est pas disponible après le retour de la fonction.

Vous pourriez utiliser malloc une fois de plus pour allouer le tableau lui-même, et il sera alors disponible après le retour de la fonction.

3voto

Kannan Goundan Points 2090

N'oubliez pas non plus d'allouer strlen(s)+1 octets pour les chaînes de caractères. Les chaînes de caractères C se terminent par l'octet zéro et vous devez vous assurer qu'il y a de la place pour cet octet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X