2014-01-09 4 views
0

내 프로그램에 두 개의 구조체가 있습니다.구조체에 대한 포인터 배열의 동적 할당

연결 아이디의 목록 및 WORD

typedef struct related 
{ 
    int id; 
    struct related* next; 
} RELATED; 

typedef struct word 
{ 
    int id; 
    char name[NAME_LEN]; 
    RELATED *related; 
} WORD; 

난 WORD의 배열을 유지하고 싶은 나는 다이내믹 원한다. 값

WORD* word1; 
WORD* word2; 

:

나는 단어 2 포인터를 가지고있다.

내가 동적으로이 방법으로 그것을 할당하는 셈입니다

:

WORD** arr = (WORD**)malloc(sizeof(WORD*)*10) // to hold 10 words 

및 배열에 단어를 추가하는 것을 시도는, 첫 번째가 제대로 추가되지만 첫 번째를 통해 두 번째 실행 :

arr[0] = word1; 
arr[1] = word2; 

난 배열이 방법으로 한정하고 때

WORD* arr[40]; 

단어 같은 추가 기능을 w 좋은 오크

arr[0] = word1; 
arr[1] = word2; 

이 동적 할당의 올바른 방법을 찾을 수 없습니다.

+0

[나를 위해 잘 작동하는 것 같다?] (http://codepad.org/hkAq33CV) (예,하지만 이러한 목적을 위해 좋은 메모리, free'ing되지 않음) 그것은, 잘 작동합니다 – ccKep

+0

것은 당신이 공유 할 수 있습니다 프로그램 코드? – iGRJ

답변

1

보다는

// arr as pointer to pointer to WORDS 
WORDS** arr = (WORDS**)malloc(sizeof(WORDS*)*10); 

// arr as pointer to WORDS 
WORDS* arr = malloc(sizeof(*arr) * 10); // WORDS *, not WORDS ** 
  1. C gibberish ↔ English 것이 유용 할 수있다 할당.
  2. malloc()의 결과 캐스팅은 C에서 권장하지 않습니다.
  3. type *p = malloc(sizeof(*p) * N); 스타일을 고려하십시오. 유지 관리가 쉬우 며 오류 발생 가능성이 적은 IMO.
+0

죄송합니다. 제 질문을 명확히하기 위해 다시 말했습니다. –

+0

명확하지 않은 것은 "10 단어를 담는"주석입니다. 당신의'malloc()'은 WORDS에 대한 10 개의 포인터를 가지고 있습니다. 또한 포인터'word1, word2' 또는 포인터가 가리키는 날짜를 간단하게 복사하고 싶습니까? – chux

+0

@Andrey Chasovski 어떻게 "처음부터 끝까지 실행하는 두 번째"를 결정 했습니까?귀하가 편집 한 정보로, 당신이 일을 올바르게하고 있습니다 - 추가 정보가 필요합니다. – chux

1

malloc()에 문제가없고 배열의 WORD 포인터에 대한 포인터를 사용할 수 없습니다. 한 가지 지적 할 수있는 것은 단어 1과 단어 2에 대해 메모리를 할당하지 않았기 때문에 가비지 주소를 보유하고 있다는 것입니다. 동일한 가비지 주소가 arr [0] 및 arr [1]에 할당됩니다. 전체 코드를 업로드하면 정확한 문제를 찾는 데 도움이됩니다.

0

당신은 2 차원 배열 메모리의 동적 할당에 다음의 코드를 사용할 수

가 'm'을 보자 n은 어레이의 차원이다.

WORDS** arr = (WORDS**)malloc(sizeof(WORDS*)*m); 

for(int i = 0 ; i < m ; i++) 

{ 

    for(int j = 0 ; j < n ; j++) 

    { 

     arr[i] = (WORDS*)malloc(sizeof(WORDS)*n); 

    } 

} 
관련 문제