2009-11-06 2 views

답변

0

아니요. a에 함수를 할당하고 main에 사용했기 때문에 명시 적으로 문제가 없습니다.

1

아무런 문제가 없습니다. 실제로 이것은 —을 반환하는 함수가 사용 된 후에도 여전히 사용되는 메모리를 할당하는 올바른 방법이지만 실제로 사용하면 메모리가 free() 일 수 있습니다. 8 바이트는 문제가되지 않지만 메모리 누수에 대한 코딩은 좋은 습관입니다.

+1

+1'void a()'의 값을 반환하지 못했지만 (나는 거의 그것을 놓쳐 버렸고 @Ed는 우리 모두를 펀치에 이겼습니다). –

+0

Ack - 좋은 캐치! –

0

x가 가리키는 메모리를 확보하면 아무런 문제가 발생하지 않습니다. malloc()을 사용하여 호출 함수로 돌아갈 때 혼자 남겨진 힙에 메모리를 할당했습니다.

10

먼저 void()는 void를 반환하지만 char *를 반환하려고 시도합니다. char *를 반환하도록 서명을 변경하십시오.

두 번째로 함수는 괜찮지 만 반환 된 포인터가 가리키는 메모리를 해제하지 않으므로 예제 코드에 메모리 누수가 있습니다.

셋째, gbrandt가 지적했듯이 malloc 호출 후 성공 여부를 확인하지 않습니다. malloc은 실패 할 수 있으며, 그것이 있는지를 확인하는 것은 좋은 습관입니다.


대신) (A에 대한 포인터에 대한 포인터를 전달하고 호출자가()에 전달하기 전에 포인터 자체를 작성해야하는 것이 작업을 수행하는 또 다른 방법은, 그러나 어느 쪽이든 여전히 기억을 풀 필요가있다. 솔직하게 말해서, 나는이 경우에 당신의 접근 방식을 취할 것입니다. 이런 식으로 할 이유가 없으므로 나는 그것을 언급 할 것이라고 생각했다. 이 대체 접근 방식을 혼동하는 경우, 내가 설명을 제공하게 행복 할 것으로 알려 주시기 바랍니다

void a(char **p) 
{ 
    *p = malloc(8); 
    if (*p) 
    { 
     **p[0] = 'a'; 
     **p[1] = 'b'; 
     ... 
     **p[7] = 'h'; 
    } 
} 

int main(void) 
{ 
    char *x; 
    a(&x); 
    //do something with x 
    ..... 
    free(x); 
} 

(하지만, 그 순간에, 내가 일을 다시 얻을 필요!)를 갖는에서 별도로

+1

+1 나는'void' 함수에서 돌아 오는 것과 함께 나를 때려 눕히는 것에 +1하지만 심각하게'a'가'char *'를 반환하지 않는 이유는 무엇입니까? 그것은 훨씬 쉬울 것입니다. (그리고 OP에 대한 의구심이있는 것처럼 C에 익숙하지 않은 사람에게는 혼란스럽지 않습니다.) –

+0

그래, 나는 그 부분을 전혀 포함해야하는지 잘 모르겠다. 나는 원래 방법이 좋다라고 말하기 위해 포스트를 편집했고, 여기에 같은 것을 달성하기위한 대체 방법이있다. –

1

a()의 잘못된 반환 형식 (void 대신 char *이어야합니다.) 코드에는 아무런 문제가 없습니다.

작업을 완료했을 때 할당 한 메모리가 free()인지 확인하십시오.

3

위의 좋은 조언. 코드의 작은 문제는 큰 것입니다 ...

malloc 또는 함수 호출 후에는 성공 여부를 확인하지 않습니다. 오류 처리를 잊지 마십시오.

+0

+1 또한 오류 처리를 잊어 버렸기 때문에 +1. –

+0

사실, 코드에 문제가있다. (잘못 반환 된 타입), malloc의 메모리를 검사하는데 +1이있다. – Francesco

+0

+1 또한 malloc이 반환 한 것을 확인하는 것을 잊었 기 때문에 +1합니다. –

1

여기에있는 대부분의 답변은 문제가되지 않는다는 것을 나타내며, 나중에 다시 비워 두는 것을 잊지 마십시오. 이것은 기술적으로 사실이지만 실제로는 문제입니다. 한 범위에서 메모리를 할당하고 다른 범위에서 해제 될 것으로 예상 할 때마다 메모리 누수가 있는지 묻습니다. 사람들은 기억을 풀어주는 것을 기억하지 않습니다. 또한 호출자가 alloca() 또는 new() 또는 다른 것을 사용하지 않았다는 것을 malloc을 사용해야한다는 것을 알아야하는 문제가 있습니다. 그들이 일치하는 할당 해제 루틴을 호출하면 결과는 정의되지 않습니다.

요약하면 메모리를 할당하고 호출자에게 다시 전달하는 것은 대개 실수입니다.

호출자가 메모리를 할당하면 메모리를 할당하면 메모리를 확보하고 올바르게 수행해야하므로 메모리를 할당하는 것이 좋습니다.

+2

이것은 OP의 코드에는 문제가되지 않습니다. OP의 코드 (상상의) 사용자에게는 문제입니다. C 프로그래머라면 'free()'메모리를 기억해야한다. 기간. 메모리 관리를 이해하지 못하고, 그들이 끝날 때'free()'해야 할 메모리에 관한 문서를 읽지 않는다면 누구나 C를 알 수 없을 것입니다. –

+1

예, Chris에 동의합니다. 이것은 C++가 아니라 C입니다. –

+0

@Ed - 아야. 그것은 C++ 프로그래머에게 가혹한 것입니다. 반드시 그럴 필요는 없다는 말은 아닙니다 ... –

0

감사합니다. 방금 코드를 편집했습니다. 이번에는 아무런 문제가 없어 보입니다. Btw, C에서 함수가 끝나면 컴파일러는 스택의 모든 변수 (배열 & 포인터 포함)를 지우습니까?

+0

함수의 로컬 변수 인 경우 함수가 반환 될 때 스택에서 사라집니다. 하지만 힙 (ala malloc() 또는 그와 같은)에 할당 한 경우, 스택 프레임을 가리키는 포인터가 스택 프레임과 함께 손실 되더라도 반환하기 전에 해제하지 않으면 할당 된 메모리가 유지됩니다. 물론,이 예제에서는 포인터를 반환하기 때문에 호출 함수는 메모리에서 핸들을 유지할 수 있습니다. –

관련 문제