Указатели, массивы, строки и маллок в C - PullRequest
4 голосов
/ 08 апреля 2011

В настоящее время я изучаю строки, указатели и массивы на языке 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;
    }

Вывод: Вывод показывает, что что-то пошло не так

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

Первый printf, кажется, работает, но второй содержит неверные данные.Что я сделал не так?

Ответы [ 2 ]

7 голосов
/ 08 апреля 2011

Проблема в том, что вы возвращаете указатель на массив, который находится в стеке. userDetailsHolder размещено в стеке и недоступно после возврата из функции.

Вы можете использовать malloc еще раз для выделения самого массива, и тогда он будет доступен после возврата из функции.

3 голосов
/ 08 апреля 2011

Кроме того, не забудьте выделить strlen(s)+1 байт для строк.Строки C заканчиваются нулевым байтом, и вам нужно убедиться, что для них есть место.

...