2012-09-27 4 views
0

메모리 할당 문제가 있습니다. else 블록 내에 char*을 선언하면 else 블록이 실행될 때 char*이 삭제된다는 것을 의미합니다. else 블록은 while 루프에 있으므로 여러 번 반복됩니다. 그러나 else 블록에 선언 된 char*이 아래 예제에서와 같이 malloc'd 변수의 별칭이되면 어떻게됩니까? 제 질문은 어떻게 이런 수수료를내는 겁니까? 나는 임시 변수 char*을 해제하는 것처럼 느낍니다. 유지하려고하는 변수를 해제 할 것이기 때문에 세그먼트 오류가 발생할 것입니다. 그렇다면, 나는 free 진술서가 어디로가는 지 손해를보고 있습니다.메모리 할당 C

char* print_path = NULL; 

내가 다시 실행되지 않습니다 알고 후 프로그램의 끝에서 나는 무료 print_path을 지적하고 싶습니다

(싹둑)

(while) 

else{ 
     char* temp_path = print_path; 
     int temp_size = strlen(temp_path)+strlen(file_name(child->fts_path))+1; 
     print_path = (char*)malloc(temp_size); 
     strcpy(print_path, temp_path); 
     strncat(print_path, file_name(child->fts_path), strlen(file_name(child->fts_path))); 
     printf("%s:\n\n", print_path); 
     } 

이 (싹둑) . 그러나 내가 풀어보고 싶은 루프의 중간 실행이다. 어떤 도움을 주시면 감사하겠습니다. 감사합니다.

+2

스택 할당 및 힙 할당이 혼란 스럽습니다. 포인터를 비우지 않으면 포인터가 가리키는 메모리가 해제됩니다. –

+0

루프를 반복 할 때마다 해제되는 점은 무엇입니까? 루프의 지속 기간 동안 메모리 세그먼트가 필요하다는 것을 알고 있습니다. 해제 및 재 할당은 여기에서별로 의미가 없습니다. –

+0

@JordanKaye 모든 반복 작업 동안 해방의 포인트는 이전 반복의 동적으로 할당 된 변수가 더 이상 필요하지 않기 때문입니다. 데이터 샘플이 길어지면 메모리가 남아 있지 않습니다. 더 이상 필요하지 않을 때 모든 malloc 된 변수를 해제하는 것도 좋은 프로그래밍 연습입니다. – tpar44

답변

2

free(temp_path)은 옳은 모양입니다. print_path 항상 동적으로 ­ 교부가 메모리를 mallo를 가리

char * print_path = malloc(...); // "NULL" is also possible 

while (condition) 
{ 
    if (...) 
    { 
     // ... 
    } 
    else 
    { 
     char * temp_path = print_path; 

     print_path = malloc(...); 

     free(temp_path); 
    } 
} 

free(print_path); 

알고리즘의 불변 (또는이어야한다)는 다음과 같이 가야한다. malloc에 대해 정확히 free의 값을 갖는 방법에 유의하십시오.

print_paths :

+0

그렇습니다. 원래는 'free (temp_path)'문을 가지고 있었지만 부분 분할 오류가 발생했습니다. 그러나 나는'자유 '라고 생각했던 것이 거의 긍정적 이었기 때문에 무언가를 잘못했을 수도 있다고 생각했습니다. 저기로가. temp_path가 실제로 동적으로 할당 된 메모리 블록이 아닐 수 있습니까? – tpar44

0

당신은이 포인터가 ['h','e','l','l','o'] 같은 배열에 포인트를,이 포인터는 h를 가리키는이 경우, 말할 수, 배열의 첫 번째 요소의 주소를 포함하는이의 주소 h1이므로 e의 주소는 2입니다. 따라서 print_path에는 1이 포함되어 있습니다.

temp_path :이 포인터는 아무 것도 가리 키지 않거나 메모리의 임의의 위치를 ​​가리 킵니다.

malloc으로 전화 할 때 malloc은 약간의 메모리를 요청하고 새 할당 된 메모리의 주소를 제공하지만이 메모리에는 가비지가 포함되어 있습니다.

그래서

print_path = (char*)malloc(temp_size); 

print_path 새로운 할당 된 메모리의 어드레스 크기 쓰레기를 갖는다 temp_size 새로운 배열을 포함 후,이 주소 (40)이라고 말할 수 있으므로 print_path의 값 40이다.

이 마지막 때 당신이 전화 :

strcpy(print_path, temp_path); 

당신이 print_path가 가리키는 배열에 배열 temp_path (['h','e','l','l','o'])의 값을 복사 즉, 주소 대신 쓰레기가 지금 h를 포함 포함의 40, 41에는 e 등이 있습니다.

주소 (140)에 모두 h 값이 포함되어 있어도 하나를 수정해도 다른 주소에는 영향을주지 않습니다.

free(temp_path)을위한 최고의 장소는 바로 else이 끝나기 전에 당신이 malloc your'e 얻을되지 않았 음 메모리를하려고하면, 단지 나쁜 시간을 가지고, temp_path 메모리를 할당한다는 거 확인합니다.

+0

고맙습니다.하지만 게시하기 전에 시도해 보았습니다. 왜냐하면 거기에 넣을 때 세분화 오류가 있었기 때문입니다. 'temp_path'가 동적으로 할당되는 대신에'print_path'의 복사본이기 때문에 그것이 가능할 수 있습니까? – tpar44

+0

@ tpar44 첫 번째'print_path'가'NULL'이기 때문에 아마도'NULL' 포인터를 없애려고합니까? 이와 비슷한 것을 시도하십시오 'if (temp_path! = NULL) free (temp_path); ' if 첫 번째'print_path'는'NULL' 포인터가 아닙니다. 아마도'temp_path'에'temp_path = child-> fts_path'와 같은 것을 할당 할 것입니다. 즉, 나중에 사용하게 될'temp_path' 메모리에 할당하고 있습니다. 코드의이 부분에서 해제하고 나중에 액세스하려고합니다. –

0

내가 생각하기에 내가 원하는 것은 같은 변수에 메모리를 재 할당하는 것이므로 malloc 대신 realloc을 조사해야한다고 생각한다.