[완료] c언어 malloc에서 리턴 값에 대한 질문입니다..

copower의 이미지

안녕하세요.
KLDP에서 malloc에 관련된 내용들을 찾아보던 도중 궁금한 부분이 생겼습니다.

malloc의 리턴과 관련된 문제인데요, 통상적으로는 malloc으로 할당받은 시작 주소 번지의 변수를 return 해서 사용하는것으로 알고 있습니다.

예를 들자면, 이런 식이나...

 
void main()
{
	int *p;
	int num = 3;
        p = (int *)malloc(sizeof(int) * num);
        //to do
}

이런식으로 말이죠... (아래 코드는 리턴이 제대로 이루어 졌는지 헷갈리네요...단순한 예제입니다...)

 
int *int_malloc(int n, int **a)
{
	*a = (int *)malloc(sizeof(int) * n);
	memset(*a, 0, sizeof(int) * n);
	return *a;
}
 
void main()
{
	int *p;
	int num = 3;
	int_malloc(num, &p);
}

malloc을 쓰면서 생각난 궁금증은...
바로 위의 경우에서처럼 더블포인터를 이용했을 경우인데요..
이런 상황에서도 return *a; 처럼 쓰지 않고 그냥 return 1; 처럼 써도 프로그램이 돌아가는것(?) 같은 상황이 발생하네요.
지역 변수는 함수 내에서만 사용된다고 하지만 할당 받은 메모리의 시작 주소를 가리키는 포인터는 여전히 메인 함수에서도 사용할 수 있는것 같습니다.
물론, 위의 내용은 단순히 제 추측일뿐입니다.......
그리하여, 이러한 제 추측이 맞는건지 혹은 틀린건인지(틀렸다면 어디가 틀린건지...) 확실한 검증을 해주셨으면 합니다..
한 이틀 동안 포인터 + 더블포인터 + malloc 과 씨름하고 있는데 복잡하네요.....으그그;;

snowall의 이미지

위에서 int_malloc이 리턴한 값을 다른데 쓰는게 없으니 return 1;을 하든 return *a;를 하든 return somethingNobodyKnows;를 하든 아무 차이가 없습니다.

만약 int_malloc(num, &p);를 somePointer=int_malloc(num, &p);처럼 쓰고, somePointer를 다른데서 쓰려고 할때는 뭔가 문제가 생길지도 모르죠

할당은 int_malloc안에서 다 끝난겁니다.

피할 수 있을때 즐겨라! http://melotopia.net/b

snowall의 이미지

아, 그리고 int_malloc에서 넘겨받은 변수는 그 범위가 함수 안쪽이 아니라 밖에 있어서 괜찮아요

피할 수 있을때 즐겨라! http://melotopia.net/b

copower의 이미지

답변 감사합니다...
본래 생각했었던 return 1; 문제는 사실, 메인 함수내에서 int nErr = int_malloc(num,&p); 와 같이 받으려고 했었습니다.
그이유는 정수형 리턴값을 이용해서 에러체크에 이용해 보려고 했었던 부분인데...
제가 그부분을 제외하고 올렸네요...
역시 그부분에서는 문제가 발생할 수 있을것 같습니다.

추가 답변에 대해서도 약간 실마리가 풀리는 느낌인것이 함수안쪽이 아니라 밖에 있다는 말씀이 메인의 포인터 p를 &p로...
즉, 참조형으로 받아서 실인수에 할당이 되었기때문에 메인함수에서도 사용 할수 있다는 의미이신건가요???

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.