簡體   English   中英

由於長度為 20mb 的 int 導致的浮點異常(核心轉儲)/分段錯誤(核心轉儲)

[英]Floating point exception (core dumped)/ segmentation fault(core dump) due to a int that is 20mb long

a = sbrk(20*1024*1024+8192);
        a=(int *)((((int)a>>13)<<13)+8192);
    gettimeofday(&start,NULL);
    ARRAY_SIZE = 20*1024*1024+8192;
    for (times=0; times<SOME_LARGE_NUMBER; times++){
            for (i=0; i<ARRAY_SIZE; i=i+SOME_ACCESS_SIZE){
                         dummy=a[i];
                 }
    } 

顯然,我得到了上面代碼的浮點異常,這是因為 ARRAY_SIZE 是 20mb,我怎么不得到 seg 錯誤或浮點異常,但仍然有 20mb 的大小。

有很多問題:

  • 你沒有展示a是如何聲明的,所以我們不知道它的類型,也無法分析涉及它的表達式是如何計算的。
  • sbrk是一個過時的電話。 除特殊情況外,應使用malloc代替。
  • 語句a=(int *)((((int)a>>13)<<13)+8192); 嘗試將a與 8192 字節的倍數對齊,但至少應該使用uintptr_t而不是int
  • sbrk的參數是字節數,但(int *)強制轉換表明a是指向int的指針。 在任何情況下,您都應該將分配乘以sizeof *a
  • a對齊到 8192 字節的倍數后,后面就不再有20*1024*1024+8192字節可用了,因為有些已經用於對齊了。 然而ARRAY_SIZE設置為20*1024*1024+8192並在循環中使用,從而確保數組將被溢出。 可能, ARRAY_SIZE應該設置為20*1024*1024

您正在分配一個20*1024*1024+8192字節長的內存塊,然后將其視為20*1024*1024+8192 ints的數組。 請嘗試以下操作:

ARRAY_SIZE = (20*1024*1024+8192) / sizeof(int);

暫無
暫無

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

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