Ошибка сегментации. ошибка выходит из программы
Я разрабатываю программу переменного тока, которая подключается к базе данных 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 элементов.