2

我有两个函数来创建数组。

double *Array1D (int nx, int dsize) {
  double *v;
  v = calloc(nx, dsize);
  return v;
}

double **Array2D (int ny, int nx, int dsize) {
  double **v; int j;
  for (j = 0; j < ny; j++)
    v[j] = Array1D(nx, dsize);
  return v;
}

int i, j;
pn = Array2D (ny, nx, sizeof(double));
for (j = 0; j < ny; j++)
  for (i = 0; i < nx; i++)
    pn[j][i] = 1.0 + (i + j * nx) * 1.0;

for (i = 0; i < ny; i++)
  free(pn[i]);
free(pn);

数组元素被正确初始化,但释放它们会产生分段错误。

错误:

*** glibc detected *** ./array_test: free(): invalid pointer: 0x00007fff00d42a4f ***
Segmentation fault (core dumped)
4

4 回答 4

5
double **Array2D (int ny, int nx, int dsize)
{
  double **v; int j;
  for (j=0; j<ny; j++) v[j] = Array1D(nx, dsize);

v对象永远不会在您的函数中初始化。

于 2015-01-02T15:52:17.913 回答
4

你永远不会为你的二维数组分配内存。在循环v = malloc(sizeof(double *) * ny);之前你需要一行fordouble **Array2D(int ny, int nx, int dsize);

于 2015-01-02T15:52:27.567 回答
3

分配顺序是

v = malloc(sizeof(double *) * ny);
for (j=0; j<ny; j++) v[j] = Array1D(nx, dsize);

释放的顺序是

for (j=0; j<ny; j++)
free(v[j]);

free(v);
于 2015-01-02T15:50:48.090 回答
2
double **Array2D (int ny, int nx, int dsize) {
    double **v; int j;
    for (j=0; j<ny; j++) v[j] = Array1D(nx, dsize);
    return v;
}

你忘了分配*v

于 2015-01-02T15:52:27.107 回答