먼저 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'void a()'의 값을 반환하지 못했지만 (나는 거의 그것을 놓쳐 버렸고 @Ed는 우리 모두를 펀치에 이겼습니다). –
Ack - 좋은 캐치! –