Я пытаюсь инициализировать целочисленный массив и установить все элементы в 1. Мне нужно, чтобы массив имел верхнюю границу 4294967295 или максимально возможное число для 32-разрядного unsigned int
,
Это кажется тривиальной задачей для меня, и это должно быть, но я сталкиваюсь с segfault
, Я могу запустить for
Цикл пуст, и он, кажется, работает нормально (хотя и медленно, но он обрабатывает почти 4,3 миллиарда чисел, поэтому я не буду жаловаться). Проблема появляется, когда я пытаюсь выполнить какое-либо действие в цикле. Инструкция у меня ниже — primeArray[i] = 1;
— вызывает segfault
ошибка. Насколько я могу судить, это не должно привести к переполнению массива. Если я закомментирую эту строку, нет segfault
,
Уже поздно, и мои уставшие глаза, вероятно, просто упускают что-то простое, но я мог бы использовать другую пару.
Вот что у меня есть:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
#define LIMIT 0xFFFFFFFF;
int main(int argc, char const *argv[])
{
uint32_t i;
uint32_t numberOfPrimes = LIMIT; // hardcoded for debugging
int *primeArray = (int*) malloc(numberOfPrimes * sizeof(int));
for (i = 0; i < numberOfPrimes; ++i) {
primeArray[i] = 1;
}
}
Проверьте код возврата от malloc()
чтобы убедиться, что массив был фактически выделен. Я подозреваю, что следующий тест не пройдёт:
int *primeArray = (int*) malloc(numberOfPrimes * sizeof(int));
if (primeArray != NULL) { /* check that array was allocated */
for (i = 0; i < numberOfPrimes; ++i) {
primeArray[i] = 1;
}
}
Ваш malloc
вызов запрашивает 16 гигабайт памяти из системы. Если у вас не так много свободной виртуальной памяти или если вы работаете в какой-либо 32-битной системе, вызов не будет выполнен. Если вы не проверите на провал malloc
, поскольку ваш код не, массив будет NULL
и любой последующий доступ к его элементам вызовет ошибку сегментации.
Если вам действительно нужно работать с таким большим массивом, вам потребуется либо получить 64-разрядную систему с большим объемом памяти, либо переписать программу для работы с меньшим рабочим набором и сохранить оставшуюся часть на диске.