Ошибка сегментации при доступе к массиву символов вне цикла for - PullRequest
0 голосов
/ 24 октября 2018

У меня просто какие-то проблемы с segfault, который происходит в моей программе.Когда я запускаю приведенный ниже код (упрощенно), printf в цикле for работает полностью нормально, но затем завершается ошибкой при втором вызове printf.Есть идеи, что не так?спасибо.

int done = 0;
char *string = malloc (sizeof (char) * 10);
char** prompts = malloc(sizeof(char*) * 10);
for(int i = 0 ; i < 10; i++) prompts[i] = malloc(sizeof(char) * 10);

prompts[0] = "prompt1> ";
prompts[1] = "prompt2> ";
prompts[2] = "prompt3> ";
prompts[3] = "prompt4> ";

for (int i = 0; i < 4; i++) {
    do {
        char *line;
        int number;
        printf("%s", prompts[i]);
        read_line(stdin, &line, 0);
        if (sscanf(line, "%d", &number) != 1) continue;
        if (number < 0) continue;
        if (count <= number) continue;
        else {
            done = 1;
            string[i] = number + '0';
            printf("%c\n", string[i]);
        }
    } while(!done);
    done = 0;
}

printf("string %c\n", string[0]);

for(int i = 0;i < 10;i++) free(prompts[i]);
free(prompts);

return string;

1 Ответ

0 голосов
/ 24 октября 2018

Код довольно странный.Не имеет смысла динамически выделять prompts, в то время как размер является константой, просто напишите это:

  char *prompts[] = {
    "prompt1> ",
    "prompt2> ",
    "prompt3> ",
    "prompt4> "
  };

Нет, malloc или free здесь необходимо.

Но выможно сделать еще проще, полностью убрать указатель prompts и написать это:

for (int i = 0; i < 4; i++) {
    do {
        char *line;
        int number;
        printf("prompt%d> ", i + 1);
        ...

Также я предлагаю заменить

char *string = malloc (sizeof (char) * 10);

на

char *string = calloc(10, sizeof (char));

Это инициализирует выделенную память нулем, и, таким образом, ваш string будет автоматически завершен NUL.

При этом большинство ваших проблем должно исчезнуть.

Я предлагаю вам прочитать главу, посвященнуюсо строками и главой, посвященной указателям в вашем учебнике по Си.

...