yarkov
@yarkov
Помог ответ? Отметь решением.

Почему вылазит «Ошибка сегментирования»?

Поглядываю в сторону освоения С (первый день). Решил написать утилитку генератор пароля.
По традиции открыл Гугл и вперед: https://github.com/yarkovaleksei/passgen
Компилируется нормально:
$ make
gcc -c ./source/passgen.c
gcc -c ./source/main.c
gcc -o ./bin/passgen passgen.o main.o
Ошибка сегментирования

Но вместо пароля выдает в консоль:
$ ./bin/passgen -l 25
Ошибка сегментирования


UPDATE: Друзья! Спасибо за ответы! Так а исправить как это все? :D
  • Вопрос задан
  • 3435 просмотров
Решения вопроса 2
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Ну правильно, так и должен выдавать. SIGSEGV возникает тогда, когда программа пытается изменить данные в области, которые ей не принадлежат, то есть не в статическом буфере и не в динамической области, полученной через malloc().
char* result;
создаст переменную, содержащую указатель на знак. Переменная не инициализирована, поэтому содержит мусор. Если этот мусор интерпретировать как адрес для записи, что делается вот здесь:
result[counter] = randChar;
SIGSEGV гарантирован :D
Ответ написан
Комментировать
yarkov
@yarkov Автор вопроса
Помог ответ? Отметь решением.
На помощь пришел malloc:
char* generate_password(char *symbols, int length)
{
    srandom(time(NULL));
    int counter = 0;
    char randChar;
    char *result = malloc(length + 1); // FIX

    if(length < 1) {
        printf("Type in a password Length \n");
        scanf("%d", &length);
    }

    while(counter < length)
    {
        randChar = symbols[random () % strlen(symbols)];
        result[counter] = randChar;
        counter++;
    }
    return result;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@dmtrrr
Backend developer
Разберись с укащателями и выделением памяти, как ты думаешь что ты вернул здесь: return result ?
Ответ написан
@nirvimel
По науке этот вид ошибок называется Undefined behavior.
На практике это выглядит как Segmentation fault в 99% случаев.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы