Почему я получаю segfault от этого неподписанного int?

Я пытаюсь инициализировать целочисленный массив и установить все элементы в 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;
}
}

4

Решение

Проверьте код возврата от 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;
}
}
10

Другие решения

Ваш malloc вызов запрашивает 16 гигабайт памяти из системы. Если у вас не так много свободной виртуальной памяти или если вы работаете в какой-либо 32-битной системе, вызов не будет выполнен. Если вы не проверите на провал malloc, поскольку ваш код не, массив будет NULL и любой последующий доступ к его элементам вызовет ошибку сегментации.

Если вам действительно нужно работать с таким большим массивом, вам потребуется либо получить 64-разрядную систему с большим объемом памяти, либо переписать программу для работы с меньшим рабочим набором и сохранить оставшуюся часть на диске.

5

По вопросам рекламы [email protected]