2015-07-04 59 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