在特定索引处具有非常大的数组的C分段错误

时间:2015-07-04 01:33:35

标签: c arrays segmentation-fault

我有一个处理非常大的数组的程序,当我尝试使用随机值填充数组时,它总是在特定索引处进行段错误。在运行XCode的Mac OSX 10.10上,它在索引1000448处的段错误,在面向LLVM版本6.1.0的GCC上,它在1001472处出错。

这是我的代码

#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)

2 个答案:

答案 0 :(得分:1)

哎呀,我刚才意识到问题所在。我从0循环到大小,而不是长度。如果有人可以告诉我为什么这些特定的价值,那么它会很棒

答案 1 :(得分: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