с вопрос о Маллок - PullRequest
       1

с вопрос о Маллок

1 голос
/ 17 июля 2010
#include<stdlib.h>
#include<stdio.h>

int main(){

 int row;
 int col;
 int i=1;
 double ** doubleNode;
 // *(*(doubleNode+row)+coln)
 doubleNode=malloc(sizeof(double)*4);
 *doubleNode=malloc(sizeof(double *)*4);


 for(row=0; row <4; row++){
   for(col =0; col<4;col++){
    *(*(doubleNode+row)+col)=i;
    i++;
   }
 }


free(doubleNode);
free(*doubleNode);
 return 0; 
}

это тестовый код для двойного указателя. он хорошо компилируется с gcc, но когда я запускаю его. это дает мне ошибку сегментации. ты знаешь, где я ошибся?

спасибо

Ответы [ 3 ]

8 голосов
/ 17 июля 2010

Память для doubleNode должна быть выделена как указатели для удвоения, а затем вы должны выделить память для каждого указателя в массиве:

doubleNode=malloc(sizeof(double*)*4);
for (int i = 0; i < 4;++i)
   doubleNode[i]=malloc(sizeof(double)*4);

То же самое относится и к освобождению памяти:

for (int i = 0; i < 4;++i)
   free(doubleNode[i]);
free(doubleNode);
2 голосов
/ 17 июля 2010

Вы только malloc используете первый «столбец» вашей матрицы.Эта строка:

*doubleNode=malloc(sizeof(double *)*4);

эквивалентна следующей:

doubleNode[0]=malloc(sizeof(double *)*4);

Вам необходимо сделать это один раз для каждого столбца (или строки).Кроме того, я думаю, что типы в ваших sizeof утверждениях должны быть полностью изменены.

1 голос
/ 17 июля 2010

Я сразу вижу одну проблему.Вы освобождаете двойной узел, а затем разыменовываете его.Поменяйте местами два свободных.

Кроме того, я думаю, что ваши mallocs неправильного размера.Первый должен быть sizeof (double *), а второй sizeof (double).

Редактировать: И, как говорили другие, вы только выделили первый «столбец» в вашей матрице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...