2010-07-17 2 views
1
#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와 잘 컴파일하지만, 그것을 실행할 때. 그것은 나에게 segmetation 결함을 준다. 내가 어디서 잘못했는지 알아?c malloc 질문

감사합니다.

답변

8

:

for (int i = 0; i < 4;++i) 
    free(doubleNode[i]); 
free(doubleNode); 
+0

빠르지 않았습니다. 오늘 투표가 끝나지 않아 내일 답변을 upvote하라고 상기시켜주세요. –

+2

나는이 작풍을 추천한다 : 포인터 = malloc (sizeof (* pointer)); – Nyan

+0

@Dave - 당신을 위해 그것을 돌 보았습니다. –

1

나는 한 가지 문제점을 즉시 보게됩니다. doubleNode를 해제 한 다음 참조 해제합니다. 2 개의 무료 주변을 교환하십시오.

또한 귀하의 mallocs가 잘못된 크기라고 생각합니다. 첫 번째는 sizeof (double *)이고 두 번째 sizeof (double)이어야합니다.

편집 : 다른 사람들이 말했듯이, 행렬의 첫 번째 "열"만 할당했습니다.

doubleNode에 대한 메모리는 두 배로 할 수있는 포인터로 할당해야합니다 그리고 당신은 배열의 각 포인터에 대한 메모리를 할당해야
2

당신에게 :

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

같은 메모리를 자유롭게 적용 매트릭스의 첫 번째 "열"을 입력하는 경우에만 malloc입니다. 이 행 :

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

이와 동일합니다 :

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

당신은 모든 열 (또는 행)에 대해 한 번이 작업을 수행해야합니다. 또한 귀하의 sizeof 명세서의 유형을 취소해야한다고 생각합니다.