在 C 中释放双指针
Free a double pointer in C
我有两个创建数组的函数。
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)
分配顺序为
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);
double **Array2D (int ny, int nx, int dsize)
{
double **v; int j;
for (j=0; j<ny; j++) v[j] = Array1D(nx, dsize);
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;
}
您忘记分配*v
。
您永远不会为二维数组分配内存。在 double **Array2D(int ny, int nx, int dsize);
中的 for
循环之前,您需要一行 v = malloc(sizeof(double *) * ny);
我有两个创建数组的函数。
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)
分配顺序为
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);
double **Array2D (int ny, int nx, int dsize)
{
double **v; int j;
for (j=0; j<ny; j++) v[j] = Array1D(nx, dsize);
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;
}
您忘记分配*v
。
您永远不会为二维数组分配内存。在 double **Array2D(int ny, int nx, int dsize);
for
循环之前,您需要一行 v = malloc(sizeof(double *) * ny);