初始化2Darrays时出现分段错误

我已经检查过我的代码正确地划分了内存空间,但是一旦我尝试将我的2D数组初始化为某些值然后总结这些值,我就会在2×2数组上收到分段错误。 我想最终将我的代码扩展到更大的数组,但我甚至无法在这里工作。 我知道关于malloc和2D数组有很多关于分段错误的post,但由于我的C知识刚刚开始,我一直无法找到一个帮助我解决问题的post。 您可以给予任何帮助,或者如果您能指出我之前的问题,将不胜感激。 谢谢!

#include  #include  #include  int main() { double sum=0; int i,j; int N = 2; double **array; array = malloc(N * sizeof(double *)); if(array == NULL) printf("Failure to allocate memory.\n"); for(i=0; i<=N; i++) { array[i] = malloc(N * sizeof(double)); if(array[i] == NULL) { printf("Failed to allocate memory for arr[%d].\n", i); exit(0); } } for(i=0; i<=N; i++) { for(j=0; j<=N; j++) { array[i][j] = 1.0/(i+j); sum = sum + array[i][j]; } } return(0); } 

你已成为一个经典失误的受害者:使用<=而不是<

 for(i=0; i<=N; i++) 

这将初始化array [0],array [1]和MOST IMPORTANTLY数组[2](因为2 <= 2),但是你没有三个指针的malloc空间,只有两个。

这是你想要的:

 for(i=0; i 

它将遍历数组[0]和数组[1](总共两个条目)。

(不是说你没有其他的错误,但这绝对是其中之一。)

您正在为NxNarrays分配空间,但是在您的for循环中,您尝试访问(N + 1)个(N + 1)数组。 您可以通过以下方法之一替换您的周期:

 for(i=0; i 

要么

 for(i=1; i<=N; i++) 

假设您正在计算1.0 /(i + j) ,则可以使用第二个,因为当i = 0,j = 0时,第一个将产生除以零。 但要注意,如果你使用第二个选项,你应该将索引移动1,如下所示: array [i-1] [j-1] ,因为它们总是从0开始。最好使用第一个选项。