3

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

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

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);
 }
4

2 回答 2

6

您已经成为经典错误之一的受害者:使用<=而不是<.

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

这将初始化数组 [0]、数组 [1] 和最重要的数组 [2](因为 2 <= 2),但是您没有为三个指针分配空间,只有两个。

这就是你想要的:

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

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

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

于 2013-09-27T20:09:01.083 回答
3

您正在为 NxN 数组分配空间,但在您的for循环中,您试图访问 (N+1) by (N+1) 数组。您可以使用以下方法之一替换您的周期:

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

或者

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

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

于 2013-09-27T20:13:34.607 回答