상수의 값 대입에 대해 궁금한게 있습니다. 친구와 서로 우기는 중인데, 보시고 둘다 수긍할 수 있도록 한말씀 부탁드립니다~.

sia79의 이미지

우선 샘플 소스를 보아주십시요.

#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를 쓰는 것보다 훨씬 퍼포먼스가 좋다고 말합니다.

명쾌하게 이야기 해 주고 싶은데 제겐 좀 무리군요.
지식 좀 나눠주시길 부탁드립니다.

appler의 이미지

가물가물하지만

#define 문 포함해서 위로는

전처리 부분입니다.

프로그램 끝날때까지

유지 됩니다.

이상 입니다.

저도 초급 개발자라..잘 모르지만....

친구처럼 하는게 나아 보이는군요.

const char * haha= "hahaha";
는 어떠신지..


laziness, impatience, hubris 不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

sia79의 이미지

답변 감사합니다;; 우웅...

myueho의 이미지

친구분 말 중에 틀린부분은 “main에서 값을 바꿔주지 않는 이상”이라고 했는데 코드내의 문자열 상수(literal)는 수정할 수 없습니다.
저라면 전처리문을 쓰지 않고
char const * haha= "hahaha";
와 같이 썼을 것 같습니다.

그리고 일반적으로 함수내에서 할당한 포인터를 리턴하는 것은 좋지 못한 습관입니다.

sia79의 이미지

함수 내부에서 조건에 따라 define된 몇가지 중에서 하나를 내보내는 것을 간단히 추스리다보니...

답변 감사합니다.

그런데, 함수내에서 할당안 포인터를 내보내지 않으면 어떤 방법으로 문자열을 넘겨줄수 있나요?

unipro의 이미지

int b(char* b, int sz);
와 같이 해서 포인터와 그 크기를 넘기는 것이 보통의 방법입니다.
더불어, b가 NULL 일때 필요한 버퍼의 크기를 반환하는 것도 좋은 선택입니다.

함수내에서 할당한 포인터를 넘기려면
char* b(); // 주의: 사용 후에 반드시 free() 하세요.
와 같이 반환값으로 포인터를 넘겨주고, 주석에 free() 하라고 명시하도록 합니다.

----
내 블로그: http://unipro.tistory.com
내 위키: KLDPWiki:unipro

내 블로그: http://unipro.tistory.com

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.