2009-11-26 10 views
1

나는 아무 것도 잘못하지는 않았지만 어쨌든 물어볼 것이라고 생각한다.더블 포인터와 구조체

우리는이 :

struct some_struct **array_of_ptrs = calloc (num, sizeof (struct some_struct*)); 

지금 난 그냥 struct some_struct에 '배열'에서이 포인터의 각 지점 가정합니다. 이제 메모리를 확보하는 것이 확실합니다.

free (array_of_ptrs); 

분명히 허용됩니다. 내가 물어 보는 이유는 내 코드에서 비슷한 것을하고 gdb가 자유 오류를 불평하기 때문이다.

+0

오류를 재생산하는 최소한의 프로그램을 제공하면 더 좋을 것입니다. – Amnon

+1

나는 그것을 할 수 있다고 믿는다 : struct some_struct ** array_of_ptrs = calloc (num, sizeof * array_of_ptrs); – Skizz

+0

'array_of_ptrs'를 해제하기 전에'array_of_ptrs [0]'을'array_of_ptr [num-1]'으로 비우지 않습니까? – Amarghosh

답변

2

구조 배열이 아닌 포인터의 배열을 얻고 있고 직접 포인터를 할당해야한다는 것을 알고있는 한 올바른 것처럼 보입니다. 그것은 당신이하고있는 것처럼 들립니다.

array_of_ptrs[0]에서 array_of_ptrs[num-1]까지 할당 할 수 있습니다. array_of_ptrs[num]을 할당하면 문제가 발생합니다.

+0

@ graeme-perrow : 감사합니다. Graeme, 방금 일부 확인을 원했습니다. 내 코드가 엉망이 될 것입니다. – tamb

0

네, 여기서 뭘하고있는 것이 정확합니다. 포인터 num 배열을 할당하고 있습니다. 따라서 4 바이트 포인터, 4 * num 바이트를 가정하면 모두 0으로 초기화됩니다. 그런 다음 각 포인터를 다른 포인터에 할당하면 free 포인터 목록을 만들 때 문제가 발생하지 않습니다.

정확하게 gdb가 불평하는 것은 무엇입니까? 이 포인터가 unfreed로 향하고있는 것에 대해 불평 할 수 있습니까? 실제 구조체 자체가 동적으로 할당 된 경우 포인터 목록을 해제해도 각 포인터가 가리키는 포인터가 해제되지 않습니다.

+0

@ jeff-shattock : 안녕하세요. Jeff. 포인터가 가리키는 것에 대해 불평하지 않는다고 생각하지 않습니다. 내가 그것을 복제하고 오류를 게시하려고합니다. 감사. – tamb

0

free(array_of_ptrs);
그러면 각 항목에 해당 포인터 배열에 포인터가 있기 때문에 메모리 누수가 발생합니다. 먼저 malloc 된 각 포인터에
free(...);
을 수행하는 것이 좋습니다. 그 다음에 최종
free(array_of_ptrs);
을 발행하십시오. 포인터

 
while (!*array_of_ptrs){ 
struct *some_ptr_to_struct = *array_of_ptr; 
free(some_ptr_to_struct); 
*array_of_ptrs++; 
} 
free(array_of_ptrs); 

희망이 도움이, 안부, 톰를 사용하여 연결리스트를 처리 할 때 매우 비슷한 일이다.

+0

@ tommieb75 :하지만 배열에서이 포인터에 대해 어떤 것도 malloc하지 않습니다. 단지 기존 구조체를 가리키고 있습니다 (나중에 처리됨). 따라서 배열의 각 구성원을 해제 할 때 '포인트'가 표시되지 않습니다. – tamb

+0

@tamb : 오, 알았어. '포인터'를 '배열'의 각 포인터에 * some_struct * 구조체로 가리킨다 고했을 때.'나는 각 포인터가 malloc되어 some_struct *의 배열을 가리키고 있다는 인상 아래에있었습니다. 혼란을 드려 죄송합니다. – t0mm13b

0

(struct somestruct *) 포인터가 모두 이미 할당 된 메모리를 가리키고 있다고 가정하면 네, 올바르게 보입니다.

오류에 대해 gcc의 어떤 버전을 사용하고 있습니까? 필자는 4.3.3에서 코드를 테스트했으며 -Wall -pedantic조차도 불만없이 컴파일했습니다.