2013-09-23 31 views
0

我正在嘗試做一個家庭作業分配來測量二級緩存的大小。我試圖用隨機整數創建並填充大型數組(對於高速緩存來說太大),然後我將以不同的步長進行遍歷並對性能進行基準測試。將值插入大數組時,程序崩潰C

我遇到的問題是當我爲大數組分配內存,然後開始用1到100之間的隨機整數填充數組時,程序崩潰(堆棧溢出?)。

不幸的是,我對c編程非常陌生。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(int argc, char *argv[]) 
{ 
    int buffSize = sizeof(int) * 2000000; 

    int * buff = (int*) malloc(buffSize); 


    srand(time(NULL)); 

    for (int i = 0; i < buffSize; i++) 
    { 
     int r = rand() % 100 + 1; 

     buff[i] = r; 
    } 

    return 0; 
} 
+0

你是否檢查'malloc'的返回值? –

+0

當i = 2000000時發生錯誤。您分配的變量爲每個sizeof(int)的2000000個實體留有空間。使bufsize ==(4字節)* 2000000 == 8000000)。嘗試'for(int i = 0 i <2000000; i ++);' – ryyker

回答

4
for (int i = 0; i < buffSize; i++) 

你走得太遠了。你只需要去2000000,而bufsize2000000 * sizeof(int)

+1

@zubergu - 訣竅在於閱讀右半部分。 –

+0

哦,杜哈。謝謝! – goodie2shoes

0

您並未創建新陣列,而是基於當前體系結構的int大小分配一塊內存。然後繼續將其視爲一個數組,這是因爲數組和指針的工作原理。

一旦你這樣做,你就開始走陣,但你卻混爲一談數組的長度使用存儲器的大小。如果每個int需要4個字節,則大小爲2000000 * 4,但長度僅爲2000000。這是因爲你放入的每個int都需要4個字節,所以你只能將size/4價值的物品放入該空間。

你想要的東西,只是創建一個數組避免malloc的問題,而且是比較明顯的:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(int argc, char *argv[]) 
{ 
    int arr_length = 2000000; 
    int arr[arr_length]; 

    srand(time(NULL)); 

    for (int i = 0; i < arr_length; i++) 
    { 
     int r = rand() % 100 + 1; 

     arr[i] = r; 
    } 

    return 0; 
} 
+0

我發現我無法創建大於2mb的數組,因爲程序在我試圖訪問時崩潰。這就是我使用malloc的原因。 – goodie2shoes