#include <stdio.h> #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 void allocMemory(void *ptr, int size) // 반환값 없음, void 포인터 매개변수 지정 { ptr = malloc(size); // ptr은 allocMemory를 벗어나면 사용할 수 없음 }1.주석에 ptr은 allocMemory를 벗어나면 사용할 수 없다고 나옵니다. 그런데 책 앞부분을 보면
동적메모리는 함수를 벗어나도 계속 유지된다고 메모리를 해제하지 않으면 메모리누수가 발생한다고 나오는데 왜 벗어나면 사용할수 없는건지 모르겠습니다.
2.이중포인터도 헷갈리는데 ptr도 포인터 값 아닌가요?
함수에 사용될때 포인터와 관련있는게 아니라 무조건 변수로 보고 변수의 주소에 들어가는 값을 바꿔줘야 함수가 끝나도 유지되는건가요?
좀 어려워서 질문도 난해한거같네요..
책 앞 부분에 동적 메모리 할당은 return으로 반환합니다.
63.3의 해당 예제는 메모리 누수가 발생하고 사용할 수 없는 예제를 의도적으로 보여준 것입니다.
코드를 사용하는 패턴을 잘 살펴보고 암기해서 자연스럽게 쓸 정도로 연습하는 게 좋습니다.
return하지 않으면 함수 맥락 안에서만 유효합니다. 함수 맥락을 벗어나면 유효하지 않습니다.
allocMemory 함수의 올바른 사용 형태는 Unit 61.3에 있으며 return으로 반환합니다. Unit 63.3의 allocMemory는 잘못된 사용 패턴을 보여주는 것입니다.
Unit 61.8과 Unit 61.12에서 allocMemory를 올바르게 사용하는 법을 반복해서 설명하고 문제로 제시하고 있습니다.
해당 예제와 비교해보면 이해가 될 것 같습니다. 이해가 안 되면 반복해서 보는 것을 추천합니다. 그래도 이해가 안 될 때는 무시하고 1회독 한 다음에 2회독하시는 것을 추천합니다.
그럼 만약 63.3의 함수의 반환값을 바꾸는 형태로 사용하면 이중포인터를 사용하지않아도 되는건가요? void가 아니라 포인터를 리턴하게 만들면 ..?그러면 메인함수도 수정해야겠지만 가능한지가 궁금합니다.
반환값이 없으니 그 메모리주소를 이용해서 ptr를바꾸는거라고 이해하면 되는건가요?
질문이 잘 이해가 안 됩니다.
일단, 아는 범위에서 정리를 하면
데이터가 행렬이나 표 같은 2차원 형태이면 2차원 배열 또는 2중 포인터로 전달합니다. 함수의 인자를 [] 배열 형태로 선언해도 C 언어 컴파일러는 포인터 형태로 변환해서 처리합니다. 따라서 []나 *, 어느 것을 써도 모두 포인터 형태로 변환해서 내부에서는 처리합니다.
2차원 데이터를 함수에 전달해야 하면 인수에 2차원 배열이나 2중 포인터를 전달해야 합니다.
2차원 데이터를 함수에서 반환해야 한다면 return에서 2차원 배열이나 2중 포인터를 반환해야 합니다.
2차원 배열을 1차원 배열로 선언할 수 없는 것처럼 2차원 포인터를 1차원 포인터로 처리할 수는 없습니다.
함수 인자에 []를 쓰냐, *를 쓰냐는 오랜 논쟁거리였습니다.
이전 답변에 상세한 설명이 있으니 참고해주세요.
https://dojang.io/mod/forum/discuss.php?d=599&parent=1352