[英]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.