Почему я получаю segfault в конце приложения после того, как все сделано правильно? - PullRequest
3 голосов
/ 02 апреля 2010
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
        unsigned char *stole;
        unsigned char pass[] = "m4ak47";
        printf("Vnesi password: \t");
        scanf("%s", stole);
        if(strncmp(stole, pass, sizeof(pass)) != 0)
        {
                printf("wrong password!\n");
                exit(0);
        }
        else
                printf("Password correct\n");
        printf("some stuf here...\n\n");
        return 0;
}

Эта программа работает хорошо, но с одной проблемой - если пароль верный, тогда она печатает «некоторые вещи здесь ...», но в конце также показывает ошибку ошибки сегментации. Почему?

Ответы [ 3 ]

4 голосов
/ 02 апреля 2010

unsigned char *stole;
Вышеприведенный оператор объявляет stole как указатель на unsigned char и содержит значение мусора, указывающее на некоторую случайную ячейку памяти.

scanf("%s", stole);
Приведенный выше оператор пытается сохранить в памяти некоторую строку, указанную stole, которая используется другой программой (по крайней мере, не выделена вашей программе для использования). Итак, когда scanf пытается перезаписать эту память, вы получаете seg-fault.

Попробуйте выделить память для stole следующим образом

unsigned char stole[MAX_SIZE];

или

unsigned char *stole = malloc((MAX_SIZE+1) * sizeof(char));
// +1 for null-terminating

Динамический строковый ввод

1 голос
/ 02 апреля 2010

Вы должны предоставить хранилище для stole, что-то вроде:

unsigned char stole[1024];

Это по-прежнему даст ошибку по умолчанию, если пользователь вводит более длинную строку, чем 1024 символа, однако, чтобы исправить это, вы можете использовать:

scanf("%1023s", stole);

1023 используется вместо 1024, так что есть место для ограничителя строки.

1 голос
/ 02 апреля 2010

stole - это висячий указатель - вам нужно выделить для него немного памяти (например, malloc)

...