2013-10-22 4 views
4

malloc을 사용하여 이중 포인터를 작성하는 함수를 작성해야합니다. malloc 이중 포인터에 함수를 작성하십시오.

내가 내 이중 포인터를 선언하는 방법이다 나는 평소 :

void mallocDoubleArr(double **arr, int size) 
{ 
    int i, j; 

    *arr = malloc(size * sizeof(double*)); 

    for(i = 0; i < size; i++) 
    { 
     arr[i]= malloc(size*sizeof(double)); 
     for (j = 0; j < size; j++) 
     { 
      arr[i][j] = 0; 
     } 
    } 
} 

: 함수의 존재와

double **G; 
mallocDoubleArr(G, numNodes); 

: 이제

double **G; //Create double pointer to hold 2d matrix 

*G = malloc(numNodes * sizeof(double*)); 
for(i = 0; i < numNodes; i++) 
{ 
    G[i] = malloc(numNodes*sizeof(double)); 
    for (j = 0; j < numNodes; j++) 
    { 
     G[i][j] = 0; 
    } 
} 

나는 그것을 교체 시도 왜이 기능이 작동하지 않습니까?

mallocDoubleArr(&G, numNodes); 

로 전화 한 후

void mallocDoubleArr(double ***arr, int size); 

을 그리고 :

+0

'calloc'을 사용하여 일부 작업을 저장할 수 있습니다. 기본적으로'malloc'과 똑같은 일을하지만 메모리를 0으로 설정하여 가장 안쪽의'for' 루프를 제거 할 수 있습니다. – patrickvacek

답변

6

당신은 떠 즉 포인터에 대한 포인터에 대한 포인터 같은 참조 G을 통과 한 번 더 "간접"를 필요 그에 따라 mallocDoubleArr을 수정하십시오. 예를 들어

+0

같은 방법으로 무료로 사용할 수 있습니다. – Ace

1

F 또는 우선, 당신은

*G = malloc(numNodes * sizeof(double*)); 

G = malloc(numNodes * sizeof(double*)); 

에 라인을 변경해야합니다 (당신이 할 수없는 당신이 뭔가를 할당 한 안전하게 될 때까지 포인터. 역 참조)

둘째, 당신의 함수는 전달 된 포인터를 수정하므로 포인터가 필요합니다. 귀하의 서명을 대신하여

void mallocDoubleArr(double ***arr, int size) 

해야하고 포인터가 가리키는 포인터를 액세스하는 코드에 관련 indirections을 추가해야합니다.

초보자가 포인터를 사용하여 작업하는 데 많은 혼란이 내 의견으로는 일반적인 구형 변수와 다른 것이라고 생각합니다. ints, float 등의 포인터는 스택에있는 변수 일뿐입니다. 주소가 있고 함수에 동일한 방식으로 전달됩니다. 함수에서 변수 (int, float, pointer 등)를 변경하려면 포인터를 전달해야합니다. 이와 관련하여 차이점은 없습니다.

3

C는 값 별 호출입니다. In

double **G; 
mallocDoubleArr(G, numNodes); 

당신은 mallocDoubleArr에 초기화되지 않은 변수를 전달합니다. 0 일 수도 있고, 다른 것일 수도 있지만, mallocDoubleArr이 할당 할 수있는 것이 거의 확실하지 않습니다.

코드와 함수의 정의를 G의 주소로 전달할 수 있지만 다른 수준의 포인터를 처리 할 수 ​​있습니다. 그러면 코드를 이해하기가 더 어려워 질 수 있습니다. 그게 정말로 요구 사항이 아니라면, 대신 mallocDoubleArr에게 double **을 반환하도록 제안 할 것입니다.

double **G; 
G = mallocDoubleArr(numNodes); 

double **mallocDoubleArr(int size) 
{ 
    int i, j; 
    double **arr; 

    arr = (double **) malloc(size * sizeof(double *)); 

    /* continue with old code */ 

    return arr; 
} 

편집 : bstamour 님의 글은 제 글을 쓰는 동안 만들어졌습니다. 겹쳐서 죄송합니다.]

0

할당 및 해제를 위해 다음과 같은 행렬 연산 코드를 사용합니다.

int **inputMatrix, i, j; 
Grid myGrid = *grid; 

inputMatrix = (int *) calloc (myGrid.num_nodes, sizeof(int*)); 
for(i=0; i < myGrid.num_nodes; i++){ 
    inputMatrix[i] = calloc(myGrid.num_nodes, sizeof(int)); 
    for(j=0;j<myGrid.num_nodes;j++){ 
     inputMatrix[i][j] = 0; 
    } 
}; 

for(i=0; i < myGrid.num_nodes; i++){ 
    free(inputMatrix[i]); 
} 
free (inputMatrix); 
관련 문제