Frank Vilea
Frank Vilea

Reputation: 8477

Pointers, Arrays, Strings and Malloc in C

I'm currently learning about strings, pointers and arrays in C. I tried to write a program where an array holds three pointers to string addresses. It all seems to work but the program behaves strangely.

Here's the 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;
    }

Output: The output indicates that something went terribly wrong

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

The first printf seems to work, but the second has the wrong data in it. What did I do wrong?

Upvotes: 5

Views: 3732

Answers (2)

Blagovest Buyukliev
Blagovest Buyukliev

Reputation: 43498

The problem is that you are returning a pointer to an array which resides on the stack. userDetailsHolder is allocated on the stack and is not available after the function returns.

You could use malloc once more to allocate the array itself, and then it will be available after the function returns.

Upvotes: 8

Kannan Goundan
Kannan Goundan

Reputation: 5222

Also, remember to allocate strlen(s)+1 bytes for strings. C strings are terminated with the zero byte and you need to make sure there's space for it.

Upvotes: 3

Related Questions