상수의 값 대입에 대해 궁금한게 있습니다. 친구와 서로 우기는 중인데, 보시고 둘다 수긍할 수 있도록 한말씀 부탁드립니다~.
글쓴이: sia79 / 작성시간: 화, 2008/04/15 - 4:32오후
우선 샘플 소스를 보아주십시요.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define HAHA "HAHAHA" int a(char** a ) { *a = HAHA; return 0; } int b(char** b ) { *b = (char*)malloc( 6 + 1 ); memcpy( *b, "HUHUHU", 6 ); return 0; } int main(void) { char* haha = NULL; a( &haha ); printf("%s\n", haha); b( &haha ); printf("%s\n", haha); free(haha); return 0; }
현재의 소스에서는 모두 원하는 대로 찍힙니다. 다만,
여기서 친구와 엇갈리는 것이, 친구는 a함수를, 저는 b함수를 쓰는 것이 맞다고 하고 있습니다.
제 생각을 먼저 적습니다.
a함수처럼 쓰면 a함수에서 선언된 haha의 값이 메인에서 쓰이는 동안 변경되거나 지워질지도 모른다고 생각합니다.
그러니까 그 함수 스택에 쓰였던 것이 남아 있어서 main함수의 printf에서 찍힐 수 있는 것이지.
main소스가 길어지면 언젠가 못쓰게 되므로, B함수처럼 해서 써야한다고 생각합니다.
친구 생각입니다.
상수는 어딘가에 고정으로 정의되어서 프로그램 끝 날때까지 변경되지 않는다고 합니다.
그러므로 main에서 값을 바꿔주지 않는 이상 저 값이 계속 유지 된다고 합니다.
게다가 malloc을 쓰고 , memcpy를 쓰는 것보다 훨씬 퍼포먼스가 좋다고 말합니다.
명쾌하게 이야기 해 주고 싶은데 제겐 좀 무리군요.
지식 좀 나눠주시길 부탁드립니다.
Forums:
친구가 이겼다고 생각드는건... 왜그럴까요?
가물가물하지만
#define 문 포함해서 위로는
전처리 부분입니다.
프로그램 끝날때까지
유지 됩니다.
이상 입니다.
저도 초급 개발자라..잘 모르지만....
친구처럼 하는게 나아 보이는군요.
const char * haha= "hahaha";
는 어떠신지..
laziness, impatience, hubris 不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
긁적긁적;;;
답변 감사합니다;; 우웅...
친구분 말은 거의 맞습니다.
친구분 말 중에 틀린부분은 “main에서 값을 바꿔주지 않는 이상”이라고 했는데 코드내의 문자열 상수(literal)는 수정할 수 없습니다.
저라면 전처리문을 쓰지 않고
char const * haha= "hahaha";
와 같이 썼을 것 같습니다.
그리고 일반적으로 함수내에서 할당한 포인터를 리턴하는 것은 좋지 못한 습관입니다.
긁적긁적;;;
함수 내부에서 조건에 따라 define된 몇가지 중에서 하나를 내보내는 것을 간단히 추스리다보니...
답변 감사합니다.
그런데, 함수내에서 할당안 포인터를 내보내지 않으면 어떤 방법으로 문자열을 넘겨줄수 있나요?
int b(char* b, int sz); 와
int b(char* b, int sz);
와 같이 해서 포인터와 그 크기를 넘기는 것이 보통의 방법입니다.
더불어, b가 NULL 일때 필요한 버퍼의 크기를 반환하는 것도 좋은 선택입니다.
함수내에서 할당한 포인터를 넘기려면
char* b(); // 주의: 사용 후에 반드시 free() 하세요.
와 같이 반환값으로 포인터를 넘겨주고, 주석에 free() 하라고 명시하도록 합니다.
----
내 블로그: http://unipro.tistory.com
내 위키: KLDPWiki:unipro
내 블로그: http://unipro.tistory.com
댓글 달기