2015-01-02 2 views
2

У меня есть две функции для создания массивов.Бесплатный двойной указатель в 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) 
+1

Почему вы передаете 'dsize', когда' sizeof (double) 'постоянна? Это похоже на то, что он пытается быть общим, но по-прежнему использует 'double *' внутренне. Очень смущает. – unwind

ответ

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 объект никогда не инициализируется в функции.

+0

Downvoter, пожалуйста, объясните ваш downvote, и если вы считаете, что проблема в другом месте, пожалуйста, уточните. – ouah

+0

Не downvoter (на самом деле, я один из upvoters), но пока вы указываете, в чем проблема, вы никогда не укажете, как это исправить (т. Е. Поставить вызов «malloc» или 'calloc' перед циклом). – wolfPack88

+1

@ wolfPack88 Это преднамеренно. Я указываю, где проблема (и поэтому отвечаем на вопрос о том, что вызывает срабатывание segfault), и теперь это зависит от OP, чтобы выяснить, как ее исправить. – ouah

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); 
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.

4

Вы никогда не выделяете память для своего 2-го массива. Вам нужна строка v = malloc(sizeof(double *) * ny); прямо перед вашей петлей for в double **Array2D(int ny, int nx, int dsize);