2017-03-05 1 views
0

나는 내 코드를 지나치게 단순화시키지 않았 으면 좋겠지 만, 기본적으로 컨테이너에서 요소의 존재를 확인하고 포인터를 리턴하는 것이 기본이다.포인터에 액세스하는 데 문제가 있습니까?

나는

typedef struct INHs{ 
    int ID; 
} INHs; 

typedef struct sub_container{ 
    INHs** list_inh; 
    int nb_list; 
} sub_container; 

typedef struct container { 
    sub_container* cont; 
    int nb_elem; 
} container; 

과 같은 구조를 가지고 다음 내 주요 방법 나는 할당 된 컨테이너를 (내가 단순 위해 그것을 밖으로두고, 주어진 ID 것, 그리고 지금 내가 반복하지 않을 것이다 내 목표 INHs 구조를 찾으려면 하위 컨테이너).

INHs** test_INH = NULL; 
INHs** return_val = NULL; 

int ID = 10; 

container* cont; //allocated on all memory 

for (uint n=0; !test_INH && n<container_nb_elem; n++){ 

    return_val = find_ptr(&cont[n], ID, &test_INH); 

} 


INHs** find_ptr(sub_container* sub_cont, int ID, INHs*** test){ 

    INHs** res = NULL; 

    for (uint i=0; !res && i<sub_cont->nb_list; i++){ 

     if (sub_cont->list_inh[i].ID == ID) { 

     (*test) = &(sub_cont->list_inh[i]); 
     res = &(sub_cont->list_inh[i]); 
     } 

    return res; 
} 

내가 내 요소에 반환 값과 함수의 매개 변수로 다른 두를 필요가 없습니다 알고 있지만이 내가 시도했던 두 가지 버전이 있습니다. 내가 뭘 잘못하고 있는지 모르지만 valgrind 충돌은 "test_INH"또는 "result_val"이 초기화되지 않았 음을 알려주지 만 null로 설정합니다.

누군가 내가 여기에없는 것을 보았습니까?

+1

구조를 할당 한 방법을 확인하는 것이 적절하다고 생각합니다 –

+0

정확한 오류를 표시 할 수 있습니다. – nbro

+1

주 : C는 _methods_를 지원하지 않습니다. 그리고 디버거를 사용해야합니다. – Olaf

답변

1
typedef struct INHs{ 
    int id; 
} INHs; 

typedef struct sub_container{ 
    INHs **ptrs; 
    int nb_list; 
} sub_container; 

typedef struct container { 
    sub_container *items; 
    int nb_elem; 
} container; 

int main(void) 
{ 
INHs **found = NULL; 
int id = 10; 
container *cont; //allocated on all memory 

for (uint n=0; n < cont->nb_elem; n++){ 
    found = find_ptr(&cont->items[n], id); 
    if (found) break; /* found it! */ 
    } 

if(found) { 
     /* do something useful with *found ... */ 
     } 
return 0; 
} 

INHs **find_ptr(sub_container *sub_cont, int id) 
{ 

for (uint i=0; i < sub_cont->nb_list; i++){ 
    if (sub_cont->ptrs[i]->id != id) continue; 
    return &sub_cont->ptrs[i]; 
    } 

return NULL; 
} 

은 BTW : 나는 오히려 이상한 하나 integer 구조에 대한 포인터의 배열을 찾을 수 있습니다. 이러한 구조체는 모두 malloc() d 개별입니까?

+0

1 정수 구조가 MCVE 생성 프로세스의 인공물 일 가능성이 있습니다 (또는 적어도 우리가 척할 수 있음). –

+0

@JonathanLeffler Agreed. 그것은 실제로 어떤 이질적인 항목 일 수 있습니다. 또는 다른 구조체에 대한 포인터. – wildplasser

관련 문제