C中的指针,数组,字符串和Malloc

Fra*_*lea 4 c arrays string malloc pointers

我正在学习C中的字符串,指针和数组.我试着编写一个程序,其中一个数组包含三个指向字符串地址的指针.这一切似乎都有效,但程序表现得很奇怪.

这是代码:

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;
    }
Run Code Online (Sandbox Code Playgroud)

输出:输出表明出现了严重错误

Host: localhost
Username: root
Password: mypassword
Host: root
Username: localhost
Password: Host: %s
Username: %s
Password: %s
Run Code Online (Sandbox Code Playgroud)

第一个printf似乎工作,但第二个有错误的数据.我做错了什么?

Bla*_*iev 7

问题是您正在返回指向堆栈中的数组的指针.userDetailsHolder在堆栈上分配,在函数返回后不可用.

您可以malloc再次使用它来分配数组本身,然后在函数返回后它将可用.