C: Почему эта ошибка сегментации? - PullRequest
1 голос
/ 30 сентября 2019

В основном я пытаюсь напечатать что-то вроде "1 2 3"

Однако, когда я запускаю это на терминале, это дает мне ошибку сегментации без объяснения причин ...

#include <stdio.h>
#include <string.h>

int main() {
    int width = 4;
    char complete_row[width * 3 * 2];
    char one[3], two[3], three[3], space[1];
            strcpy(space, " ");
            strcpy(complete_row, "");
            int count = 0;
            //make sure single line of color is replicated as much as width
            while (count < width) {
                strcpy(one, "1");
                strcat(one, space);
                strcpy(two, "2");
                strcat(two, space);
                strcpy(three, "3");
                strcat(complete_row, one);
                strcat(complete_row, two);
                strcat(complete_row, three);
            }
            //print that twice in the output file
            printf("%s", complete_row);
            printf("%s", complete_row);
    return 0; 
}

Ответы [ 2 ]

3 голосов
/ 30 сентября 2019

В вашем коде есть как минимум две проблемы:

  1. цикл while никогда не останавливается, потому что вы не увеличиваете count в цикле. Поэтому вы объединяете строку в complete_row снова и снова, что в конечном итоге приводит к переполнению буфера, что приводит к неопределенному поведению (может быть ошибкой по умолчанию)
  2. char space[1] объявляет массив, который может содержать ровно один символ, но для" " вам нужны два символа из-за ограничителя строки NUL. Доступ к массиву вне границ приводит к неопределенному поведению (может быть сбоем).

Исправленный код, см. Комментарии (не проверено, могут быть другие проблемы)

int main() {
    int width = 4;
    char complete_row[width * 3 * 2];
    char one[3], two[3], three[3], space[2];  // space[2]
            strcpy(space, " ");
            strcpy(complete_row, "");
            int count = 0;
            //make sure single line of color is replicated as much as width
            while (count < width) {
                strcpy(one, "1");
                strcat(one, space);
                strcpy(two, "2");
                strcat(two, space);
                strcpy(three, "3");
                strcat(complete_row, one);
                strcat(complete_row, two);
                strcat(complete_row, three);
                count++;    // increment count
            }
            //print that twice in the output file
            printf("%s", complete_row);
            printf("%s", complete_row);
    return 0; 
}
0 голосов
/ 30 сентября 2019

В вашем коде есть две проблемы
1. Из-за вашей переменной count . Вы не увеличиваете переменную count, поэтому count всегда равен 0, а цикл никогда не заканчивается или идет бесконечно.
2. Недостаточно размера массива.

Также для ожидаемого результатаНе нужно применять цикл здесь, как вы написали код для объединения. Таким образом, удаление цикла будет работать. Вставляем ваш рабочий код.

#include <stdio.h>
#include <string.h>

int main() {
int width = 4;
char complete_row[width * 3 * 2*2];
char one[3], two[3], three[3], space[1];
        strcpy(space, " ");
        strcpy(complete_row, "");
        int count = 0;
        //make sure single line of color is replicated as much as width

            strcpy(one, "1");
            strcat(one, space);
            strcpy(two, "2");
            strcat(two, space);
            strcpy(three, "3");
            strcat(complete_row, one);
            strcat(complete_row, two);
            strcat(complete_row, three);

        //print that twice in the output file
        printf("%s", complete_row);

return 0;

}

...