Возвращение массива символов - PullRequest
0 голосов
/ 23 февраля 2012

Я написал функцию для генерации случайных имен. Это мой код

 char *getrandumstring(int n)
{
    int i;
    char *str;

    for(i=0;i<n;i++)
    {


    str[i] = (rand() % 26) + 'a';
    }

    str[i]='\0';

    return str;
}

Теперь в строке

   str[i] = (rand() % 26) + 'a';

получаю ошибку сегментации. Почему?

1 Ответ

1 голос
/ 23 февраля 2012

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

char *getRandomString (int n) {
    int i;
    char *str = malloc (n + 1);
    if (str != NULL) {
        for (i = 0; i < n; i++)
            str[i] = (rand() % 26) + 'a';
        str[n] = '\0';
    }
    return str;
}

Этот код выше выделит память успешно и вернет буфер,Или, если нет доступной памяти, он вернет NULL.Просто не забудьте освободить его, когда закончите.

В качестве альтернативы, если вы не хотите использовать динамическое выделение памяти, попросите вызывающего также предоставить буфер:

void getRandomString (char *str, int n) {
    int i;
    for (i = 0; i < n; i++)
        str[i] = (rand() % 26) + 'a';
    str[n] = '\0';
}

// Somewhere else in your code:

#define STR_SZ 20
char buffer[STR_SZ+1];
getRandomStr (buffer, sizeof(buffer) - 1);
...