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

C segmentation fault with very large array at specific indices

我有一个处理非常大的数组的程序,当我试图用随机值填充数组时,它总是在特定索引处出现段错误。在 Mac OSX 10.10 运行 XCode 上,它在索引 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)

糟糕,我才意识到问题出在哪里。我从 0 循环到大小,而不是长度。不过,如果有人能告诉我为什么这些特定值,那就太好了

以下代码

  1. 编译干净
  2. 执行适当的错误检查
#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