Ошибка сегментации с многопоточностью (ncurses)

Имея следующую структуру и глобальную переменную:

typedef struct Column{
    char * text;
    int size; 
} Column;

Column * screen;

И эта функция потока:

void * thread_function(void * msg){
    Info *mesg = (Info *)msg;
    int col = mesg->c;

    int count = 0;
    while (count < MAX_ELEM){
        if (rand() % 2){ 
            screen[col].text[count] = ' ';
            screen[col].size++;    
            count++;
        } 
        else{
            screen[col].text[count] = 'a';
            screen[col].size++;    
            count++;
        }
    }
}

В основной функции после присоединения к потокам я начинаю печатать содержимое screen

int row = 42; // num of rows on the screen
while(true){
        int i;
        for (i = 0; i<col; i++){
            int j = screen[i].size - 1; // print only up to already assign value
            int k = 0;
            while (j >= 0 && k < row){
                mvprintw(k,i,"%c",screen[i].text[j]);
                refresh();
                j--;
                k++;
            }
        }
        refresh();
    }

Проблема в том, что некоторые прогоны выполняются нормально, в то время как другие генерируют ошибку ошибки Seg после нескольких итераций while(true)(Примечание: по крайней мере, что-то всегда печатается). Если я удалю mvprintw() от while(true) Ошибка сегмента никогда не возникает. В чем может быть проблема?

Ps Пожалуйста, не публикуйте ответы, связанные с мьютексом, так как это задание, и я бы предпочел исправить возникшую у меня проблему, а скорее переосмыслить идею, особенно когда ее можно выполнить без мьютекса.

Редактирование:

распределение глобальных переменных screen (часть основного)

screen = malloc(col * sizeof(Column *));
i = 0;
    for (; i<col; i++){
        screen[i].text = malloc(MAX_ELEM * sizeof(char));
        screen[i].size = 0;
    }

Экран вывода при сбоях сегмента:

                                                              a a             Segmentation fault (core dumped)

Экран вывода при отсутствии ошибок:

         a                            a  a              a             a     aa
                        a  a                                        a

1 ответ

Решение

Почувствуй это

screen = malloc(col * sizeof(Column *));

быть

screen = malloc(col * sizeof(Column)); 

так как sizeof(Column *) вернул бы только размер указателя

Другие вопросы по тегам