Ошибка сегментации. ошибка выходит из программы

Я разрабатываю программу переменного тока, которая подключается к базе данных MySQL, считывает данные из таблицы из 4 миллионов данных и записывает свои данные в еще 100 таблиц в другой базе данных после некоторых вычислений. Чтобы сделать это эффективным, я попытался использовать 100 потоков для записи данных для 100 таблиц и 1 поток для чтения данных из базы данных и записи их в буфер. Чтобы 100 потоков читали из буферов.

Но проблема в том, когда я делаю буферы. я использовал malloc сделать буферы. char *** queue; объявлен в заголовочном файле, так что он является глобальным

int i = 0, j = 0;
queue = (char ***) malloc(100);
int threadRet;

for (i; i < 100; i++) {
    queue[i] = (char **) malloc(2000);
    for (j; j < 2000; j++) {
        queue[i][j] = (char *) malloc(180);
    }
}

и мой поток записи в буфер, как я упоминал ранее, выполняет функцию void * thrededChunkPicker(void * parr)

        sprintf(queue[tableNo][marker[tableNo]], "INSERT INTO usage_summary%s(mobile,`0`,ddate) VALUES('%s',%d,'%s') ON DUPLICATE KEY UPDATE `0` = VALUES(`0`), ddate=VALUES(ddate)", row[0] + 7, row[0], sumOfUsage, row[2]);
        (marker[tableNo])++;

Вот как я пишу в буфер. Как я выяснил, здесь происходит ошибка сегментации.

Мне нужно было 100 буферов, в каждом из которых содержится 2000 строковых массивов по 180. Этот код успешно скомпилирован. Но при запуске он дает ошибку сегментации.

2 ответа

Насколько я вижу, все ваши malloc() звонки проблематичны.

Передаем размер в байтах malloc(), malloc() не имеет никакого представления о размере объекта, в котором вы собираетесь хранить возвращаемый указатель. Таким образом, он не может автоматически рассчитать общий размер требуемой памяти.

Нам нужно рассчитать общий требуемый размер и передать этот размер malloc(),

Для начала, пожалуйста, посмотрите это обсуждение, почему бы не бросить возвращаемое значение malloc() и семья в C ,,

Тем не менее, предполагая, queue определяется как char *** queue;, мы должны

  • queue = malloc(100 * sizeof*queue );
  • queue[i] = malloc(2000 * sizeof(*queue[i]) );

и так далее, если требуется.

Наконец, всегда проверяйте на успех malloc() через NULL проверьте возвращенный указатель, прежде чем использовать тот же.

Самая большая проблема в том, что malloc выделяет количество байтов, а не элементов в массиве. Таким образом, вы выделяете 100 байтов для вашей трехзвездной переменной, которой недостаточно для 100 элементов. То же самое со следующим звонком malloc он выделяет 2000 байтов, а не 2000 элементов.

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