2015-07-04 61 views
0

我有一個處理非常大的數組的程序,當我試圖用隨機值填充數組時,它總是在特定索引處進行段錯誤。在Mac OSX 10.10運行的XCode,它出現segfaults在指數1000448,和GCC針對LLVM版本6.1.0它在故障1001472.在特定索引處有非常大的數組的C段錯誤

這裏是我的代碼

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


#define WIDTH 1000 
#define HEIGHT 1000 


///////////////////////////////////////////////////////// 
// Program main 
///////////////////////////////////////////////////////// 

int main(int argc, char** argv) { 

    // set seed for rand() 
    srand(2006); 

    // 1. allocate host memory for matrices A and B 
    unsigned int length = WIDTH * HEIGHT; 
    unsigned int size = sizeof(int) * length; 
    printf("%i", size); 
    int* matrixA = (int*) malloc(size); 
    for(int i = 0; i < size; i++) { 
     printf("%i\n", i); 
     matrixA[i] = rand() % 10; 
    } 

    free(matrixA); 
} 

爲什麼這是段錯誤?我檢查了分配給matrixA的大小,它看起來是正確的大小(4,000,000)

+1

標準警告:不要投'無效*'由'malloc返回()'。還要注意,數組索引和大小的正確類型是...'size_t'。 – Olaf

+0

另外請注意'rand()%10'很可能不會有統一的分佈。但是這應該不成問題,因爲無論如何,每次調用都會得到相同的值。 – Olaf

+0

關於爲什麼這些特定尺寸是它選擇錯誤的尺寸的任何想法? – scrblnrd3

回答

1

下面的代碼

1) compiles cleanly 
2) performs the appropriate error checking 

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


#define WIDTH (1000) 
#define HEIGHT (1000) 


///////////////////////////////////////////////////////// 
// Program main 
///////////////////////////////////////////////////////// 

int main(void) 
{ 

    // set seed for rand() 
    srand(2006); 

    // 1. allocate host memory for matrices A and B 
    unsigned int length = WIDTH * HEIGHT; 
    unsigned int size = sizeof(int) * length; 

    printf("%u\n", size); 
    int* matrixA = NULL; 
    if(NULL == (matrixA = malloc(size))) 
    {// then malloc failed 
     perror("malloc failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, malloc successful 

    for(unsigned i = 0; i < length; i++) 
    { 
     printf("%i\n", i); 
     matrixA[i] = rand() % 10; 
    } 

    free(matrixA); 
} // end function: main 
+0

上述代碼正確執行。 seg錯誤事件來自寫入malloc'd內存末尾的內容。請注意,在'for'語句中使用'length'而不是'size' – user3629249

+0

「如果有人能告訴我爲什麼這些特定的值,但它會很好?」由於代碼寫入malloc的末尾' d內存,代碼有未定義的行爲。如果行爲不明確,任何事情都可能發生。 – user3629249

1

糟糕,我剛剛意識到問題所在。我從0到大小循環,而不是長度。如果有人能告訴我,爲什麼這些特定的值,不過,這將是巨大的

+0

大小是組成矩陣的總字節數。長度是矩陣中元素的數量 – jdl

+0

你甚至寫過代碼嗎? – Olaf

+0

我修改了OpenCL教程的代碼,但刪減了所有不相關的部分 – scrblnrd3