在特定索引处具有非常大的数组的 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 循环到大小,而不是长度。不过,如果有人能告诉我为什么这些特定值,那就太好了
以下代码
- 编译干净
- 执行适当的错误检查
#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
我有一个处理非常大的数组的程序,当我试图用随机值填充数组时,它总是在特定索引处出现段错误。在 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 循环到大小,而不是长度。不过,如果有人能告诉我为什么这些特定值,那就太好了
以下代码
- 编译干净
- 执行适当的错误检查
#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