Reputation: 8477
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
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
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