簡體   English   中英

為什么我從這個unsigned int獲得segfault?

[英]Why am I getting segfault from this unsigned int?

我正在嘗試初始化整數數組並將所有元素設置為1.我需要數組的上限為4294967295,或者是32位unsigned int的最大數。

這對我來說似乎是一項微不足道的任務,它應該是,但我segfault 我可以運行for循環空,它似乎工作正常(盡管很慢,但它處理了近43億個數字,所以我不會抱怨)。 當我嘗試在循環中執行任何類型的操作時,問題似乎出現了。 我在下面的指令 - 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位系統,或者重寫你的程序以使用一個較小的工作集,並將其余部分保存到磁盤上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM