2014-03-31 4 views
0

OK, 문제는 기본적으로 제목과 같습니다. 그것의 모든 비트를 가지고있는 질문을 찾을 수 없었기 때문에 나는 물었다. 구조체 배열 내부에 포인터 할당

내가 내가

t_woo* woos = malloc(num_woos * sizeof(*woos)); 

은 간단한데 (나의 습관에 대한 소리지르 사람들을 제지해야 할 것으로 판단 구조체의 배열 그래서 다음

typedef struct s_woo{ 
    char** n; 
    char* x; 
} t_woo; 

모양 싶은 말 malloc 주조).

그런 다음 각 구조체의 내용을 초기화하려고합니다.

그래서 직관적으로 내가 할 :

for(i = 0; i < num_woos; i++){ 

    num_ns = randomint1/randomint2; //let's say num_ns is big, like 250-ish, average, and changes every round of the loop 

    woos[i].n = malloc(num_ns * sizeof(char*)); 
    woos[i].x = malloc(num_ns * sizeof(char)); 
    for(j = 0; j < num_ns; j++){ 
     woos[i].n[j] = malloc(16 * sizeof(char)); // I just want 16 characters per char* 
    } 
} 

이것은 내 코드에서 무엇을의로 요약 버전입니다. 나는 가능한 무엇이든 - 내가 쓴 것을 잘못 이해할 수 있는지 알고 싶다. 특히 메모리/힙 문제, 포인터 실수 등과 같은 위의 일반적인 문제는 특별히 찾고 있지 않습니다.

"가상 메모리가 가득 참"으로 두십시오. 내 코드 오류는 malloc에서 래퍼 함수를 ​​사용하여 검사하므로 오류가 아닙니다.

+1

여기에서 잘 보입니다. '16'대신에 정의/상수를 사용하기 위해 코딩 오류를 피할 수 있습니다. 이 배열에 문자열을 저장할 것인지 여부는 모르겠지만 그렇다면 null 종결자를 잊지 마십시오. –

+0

강력한 디자인을 원한다면 좀 더 * 캡슐화 *를 사용할 수 있습니다. 즉, 't_woo'를 자체 포함 된 개체로 바꿀 수 있습니다. 이것은'num_ns' insde't_woo'를 넣는 것과 하나의't_woo' (그리고 나중에 파괴를하는 또 다른 것)에 대한 모든 구성을하는 함수를 갖는 것입니다. 그런 다음 각각에 대해't_woo'의 목록을 반복하여, 가능한 빨리 메모리를 할당 한 후 생성하십시오. –

+0

'와 루프의 모든 라운드를 변경합니다 .' .. 루프의 각 라운드에서 할당하기 전에 메모리를 할당 해제 하시겠습니까? 어쩌면 외부 루프가 여러 번 실행되어 메모리 오류가 발생할 수 있습니다. –

답변

1

더 나은 : 당신이 거기에 할당 n[woo_n_size] 없이는 x 없으며, 그 반대의 경우도 마찬가지 확인 할 수 구조체 woo_item

static const size_t woo_n_size = 16; 
    /* To make sure you use 16 everywhere, 
    * also easier to change it 
    */ 

struct woo_item { 
    char n[woo_n_size]; 
    char x; 
}; 

struct s_woo { 
    struct woo_item *items; 
    size_t size;/* optinal, to keep track of item count */ 
} 

. 지정한 null 요소로 각 목록을 닫거나 size 멤버를 저장하여 woo_items 수를 기억할 수 있습니다. s_woo