PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2009/04/15 16:37:55
Name RunDavid
Subject C 언어 관한 간단한 질문입니다.
포인터에 대한 질문입니다.

int main()
{
        char *x = "abcde";
        printf("%s %s\n", x, x+2);
        return 0;
}

이렇게 하면
abcde cde
가 출력이 된다는 것 알겠습니다.

그런데 헤더파일을 사용하는 3개의 파일로 나누어서 활용할때
======= Repetitions.h =======
int Repetitions(char *x);
============================


========== main.c ==========
#include "Repetition.h"
#include "stdio.h"
int main()
{
        int i = 0;
        char *x = "abcde";
        i = Repetitions(&x);        
        return 0;
}
============================



======= Repetitions.c =======
#include "Repetition.h"
#include "stdio.h"

int Repetitions(char *x)
{
        printf("%s %s\n", x, x+2);
        return 0;
}
============================


위의 main.c 를 실행시켰을때 Repetition.c 파일의 Repetitions 함수는 어째서 garbage value 를 리턴 할까요?

제가 하고자 하는 건 Repetitions 함수 안에서
x 가 가리키고 있는 string 을 마음대로 주무르는 것 입니다.
예를 들어 몇 글자인지 세어본다던가 strlen(x)
string 의 세번째 글자를 프린트 한다던가 printf("%c\n\n", x[2]);

제 공부하는 부분이 이 x 가 가리키고 있는 string 을
int Repetitions(char *x) 함수에서 받아서 위처럼 간단한 걸 해보는 것입니다.


p.s. 포인터 공부는 어떻게 하는게 좋을까요? ㅠㅠ

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
09/04/15 16:51
수정 아이콘
main.c 에서...
char *x = "abcde"; 로 선언해놓고서...
Repetitions(&x); 로 호출하시면, 전달되는건 x의 포인터의 포인터가 되지요.

그 부분을 Repetitions(x); 로 호출해보시면 제대로 될겁니다.
& 연산자는 해당 변수의 포인터를 전달하는겁니다.

P.S의 답: 그냥 많이 짜 보시고, 이런저런 실험을 많이 해보시는게 최선입니다.
포인터에 대한 개념을 제대로 배우는데는... 제 경우에는 Linked-list를 직접 구현해본게 최고였습니다.
알고리즘 책 같은거 가지고 한줄한줄 분석해가면서 직접 구현해보세요.
명왕성
09/04/15 16:56
수정 아이콘
제 답변은 지웠습니다.
AhnGoon님께서 설명하신게 맞습니다.

P.S 에고 그 사이에 보셨군요;;;
09/04/15 16:58
수정 아이콘
명왕성님// 으헉.. 그 답변때문에 static과 const의 개념에 대해서 답변을 쓰고 있었는데... ^^;;
명왕성
09/04/15 16:59
수정 아이콘
AhnGoon님// 그 부분은 제가 질문드려야겠네요.

char *x = "abcde"; <- 이러면 대체 어떤 일이 벌어지나요?
RunDavid
09/04/15 17:12
수정 아이콘
AhnGoon님// 명왕성님// 답변 감사드립니다.

포인터의 포인터라... 그렇군요.

P.s. 의 답변도 감사드립니다.
MoreThanAir
09/04/15 17:15
수정 아이콘
명왕성님// 제가 대신 답변을 드리면 x라는 이름으로 메모리 공간이 할당되고 그 안에는 abcde\0 이 들어갑니다.

C에서는 문자열의 경우 저절로 맨 끝에 문자열의 마지막을 나타내는 NULL문자(\0)가 들어가게 되죠.

그 때부터 저 x는 이 메모리 공간을 가리키는 포인터 변수가 되는겁니다.
09/04/15 17:16
수정 아이콘
명왕성님// 일단 "abcde"를 함수 내에서 선언했으므로, 스택 버퍼에 들어가고, 함수 밖으로 나가면 소멸됩니다.
단, 상수이기때문에, 해당 포인터에 있는 내용을 변경하려고 하면, Access Violation이 일어나겠죠.
그래서, 정확하게 선언하려면,
const char *x = "abcde";
라고 하는게 좋습니다. 그러면, 상수부를 변경하는 실수는 막을 수 있겠죠.

만약에, x에 들어가는 내용을 변경할 수 있도록 하려면,
char x[8] = "abcde";
라고 하면 됩니다. 알아서 채워주겠죠? 물론, C++ 에서...
정확한 용법은 명왕성님도 잘 아실겁니다.
char x[8]; strcpy( x, "abcde" );
이게 정석이죠.
저 정도의 함수에 malloc까지 동원하는건;;; 흐흐흐.. 좀 오버겠죠? 힙 메모리까지 들어가면 골치아프니, 여기까지;;
RunDavid
09/04/15 17:19
수정 아이콘
static과 const의 개념이 괜시리 궁금해지는데 ^^;;;
간단하게 설명해 주실수 있으실련지...
chcomilk
09/04/15 17:19
수정 아이콘
AhnGoon님// 해당 포인터에 있는 내용을 변경하려고 하면 Access Violation 난다. 하지만 static 으로 선언하면 어떨까?



(갑자기 장난기가...)
RunDavid
09/04/15 17:29
수정 아이콘
char *x = "abcde"; 이렇게 선언한 후

x[3] = 'z'; 하면 access violation 이 일어나는 건가요?
도니..
09/04/15 17:30
수정 아이콘
선언시 static 를 적게되면 정적 변수가 되어서 함수가 종료되더라도 값을 유지하고 있습니다. 일반적으로 지역변수는 함수 실행이 끝나면 사라져버리는데 반해 static 으로 선언하게 되면 변수의 값을 유지하고 있습니다.
const 는 상수로 선언할 때 사용합니다. 상수이므로 선언하면 값의 변경이 불가능합니다. 프로그램 상에서 값을 변경할 수 없도록 처리해야 하는 변수들에 대해서 const 라고 적습니다~
아이온
09/04/15 17:33
수정 아이콘
AhnGoon님// gcc인 경우 literal constant는 전역 공간에 read only로 잡고 포인터만 스택에 들어갑니다. 상식적으로 스택의 일부만 read only가 되게 컴파일러가 코드를 생성하기는 어려울 듯 하네요. 다른 컴파일러에서도 마찬가지가 아닐까 합니다.
도니..
09/04/15 17:34
수정 아이콘
RunDavid님// 네.. 당연히 일어나죠.. 간단히 설명하면 포인터로 선언해서 초기값을 넣은 후 배열로 접근하면 안됩니다..
명왕성
09/04/15 17:37
수정 아이콘
MoreThanAir님// AhnGoon님// 감사합니다. ^^
좀더 찾아보니 임베디드하는 분들은 어떻게든 메모리 용량을 줄여보려고 저걸 쓴다고 하는군요.
요새 점점 머리가 깡통이 되어가는 듯;;
09/04/15 17:38
수정 아이콘
아이온님// 정확하시네요. 간단하게 설명하다보니 그렇게 됐습니다. ^^;;
RunDavid
09/04/15 17:38
수정 아이콘
도니..님// 아 그렇군요! 그럼 만약 저 문자열을 바꾸어야 한다면, 처음부터...

어떻게 해야 하나요 -_-?
09/04/15 17:41
수정 아이콘
RunDavid님//

char x[8];
strcpy( x, "abcde" ); /* x 배열(스택 버퍼)에 "abcde" 문자열을 복사. */

로 하시면 됩니다.
물론 배열 크기는, 문자열의 길이보다 길게..

사족: 간단한 문제에 생각보다 댓글이 많이 붙었네요? 다 제 불찰(응?) 입니다...
MoreThanAir
09/04/15 17:43
수정 아이콘
RunDavid님// AhnGoon님이 위에 설명하셨네요. 그럴 경우는 char* x = "abcde"; 이런식이 아닌 char x[MAXNUM]; 이렇게 선언하시고 사용하시면 되겠습니다.
chcomilk
09/04/15 17:46
수정 아이콘
넵...

const char *p="abcd"; 나 char *p="abcd" , const char[8] = "abcd" 는 Memory map 상에 Read Only 영역에 들어 가고 ( 따라서 변경 불가)
life-time이 그 함수 내부 입니다. (함수가 끝나면 끝나요.)

static char *p="abcd" 는 Memory map 상에 Read Only 영역에 들어 가고 ife-time이 그 프로그램 종료 일때 까지 입니다. (없어 지지 않습니다.)

char p[] = "abcd" 는 Memory map 상에 Read Write 영역에 들어가고 (변경 가능) ife-time이 그 함수 내부입니다.
도니..
09/04/15 17:47
수정 아이콘
RunDavid님// 늦게 확인했더니 다른 분들께서 잘 작성해 주셨군요~ 위에도 잘 설명 되어있지만..

char *x = "abcde"; 와 char x[]="abcde"; 는 비슷하게 선언한것 같지만 많이 다릅니다. 값의 변경이 필요하다면 배열을 사용하셔야 되겠지요~
chcomilk
09/04/15 17:47
수정 아이콘
헉.. 언제 이런 답변들이.... 담배하나 피고 답변을 쓰고 있었는데......

아무튼 스텍틱이 출동하면 어떨까???
09/04/15 17:53
수정 아이콘
스텍틱 말고 걍 어셈으로 mov 시켜버리면 안될까요???
[....맞는다]
RunDavid
09/04/15 17:54
수정 아이콘
chcomilk님// 답변 감사드립니다. 설명해주신 const 나 static 의 특징은 C++ 나 Java 에서도 똑같이 적용되나요?

static functino 은... 그럼 무엇인가요? 답변이 친절하고 알기 쉬워 머리에 쏙쏙 들어오네요. 자꾸 물어보게 되고... 흐흐

이 질문을 봐주시는 모든 분들께 캄사 ㅠㅠ
09/04/15 17:55
수정 아이콘
RunDavid님// const / static 의 특징은 c++/java 에서도 동일하게 적용됩니다.
언어 신택스만 좀 다를뿐이지, 그 근간은 posix c 에서 함께 넘어온 녀석들입니다.
09/04/15 17:57
수정 아이콘
RunDavid님// static 함수는.. 간단하게 설명드리자면.
a.c 에 func1 이 있고 b.c 에도 func1 이 있다면
컴파일시 서로 참조 에러가 납니다.
하지만 a.c 의 func1 을 static 으로 선언한다면 잘~ 통과합니다 ^^
즉, 간단하게 참조 영역의 차이가 있습니다.
물론 각 a/b.c 에서 소환[?]되는 func1 함수는 서로 달라집니다 ^^
chcomilk
09/04/15 17:59
수정 아이콘
Claire님// 안되욧... 환경에따라 포팅이 안되는 경우도 많아요... T.T....

RunDavid님// 언어에 따라 약간 약간의 차이는 있지만, 비슷하게 적용 가능 합니다.

static fuction은 static 이라는 지시어가 기본적으로 scope를 한정 시키는 것 이기 때문에 static 함수/변수는 정의된 그 함수/변수가 정의된
scope에서만 사용 가능 하게 됩니다.

즉 static 함수는 그 함수를 정의한 파일에서만 호출 가능 합니다.
chcomilk
09/04/15 18:00
수정 아이콘
또 늦었당... ^^*
09/04/15 18:01
수정 아이콘
chcomilk님// 하기사... 명령어셋이 다르면 작살나기야 하는군요 -_ㅠ;;;;
예전에 드라이버 작업 하다가 그야말로 죽도록 고생한걸 떠올리니...-_-;;;
chcomilk
09/04/15 18:03
수정 아이콘
Claire님// 악몽이셨겟군요. 전 지금 2주째 악몽에서 해메고 있는 중...
09/04/15 18:23
수정 아이콘
chcomilk님// 엄청 바쁘시다고 하지 않으셨나요? (''a)
하긴 바쁘면 바쁠수록 딴청이 땡기긴 합니다만.....
chcomilk
09/04/15 18:55
수정 아이콘
AhnGoon님// 미워요....
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
53910 테넌트 라는 용어 질문입니다. [6] unluckyboy9189 09/04/15 9189
53909 연애관련 질문좀 도와주세요,, [11] 럭셔리컨트롤2140 09/04/15 2140
53907 C 언어 관한 간단한 질문입니다. [31] RunDavid1697 09/04/15 1697
53906 오늘처음미팅하는데ㅜㅜ [3] KyRiE2237 09/04/15 2237
53904 캐릭터의 레벨업과 모션의변화가 있는게임이있을까요? [7] 김민규1961 09/04/15 1961
53903 연애상담 부탁드려요. [15] 브랜드뉴2106 09/04/15 2106
53902 22인치 tv기능있는 lcd 모니터 추천해주세요 [2] prestonia1935 09/04/15 1935
53901 서울에서 화성시로 가는 대중교통 문의입니다. [3] 무조건한놈만1627 09/04/15 1627
53899 노트북 주변기기 문의입니다. [4] unluckyboy2109 09/04/15 2109
53898 미해병대의 잉크블롯 방식이 무엇인가요? [4] kiss1671 09/04/15 1671
53897 유무선공유기를 한대 구입하려고 합니다. [3] gL2107 09/04/15 2107
53896 팟플레이어에서 자꾸 띵동소리가 나네요. 훼닉2540 09/04/15 2540
53894 음악을 찾습니다. [2] 유이1634 09/04/15 1634
53892 아토피 연고에 대해서 질문할께요.. [5] 로즈마리1521 09/04/15 1521
53891 무급 게시판관리자에 대해서 어떻게 생각하시나요? [19] 부엉이1828 09/04/15 1828
53890 담배 어떤거 피시나요?? [31] Enjoy3459 09/04/15 3459
53889 다이어트 식단에 관련된 질문을... [8] 버관위_스타워1824 09/04/15 1824
53886 이제 거리로 나가야 할까요???(질문이라기보단 푸념;) [3] KnightBaran.K2430 09/04/15 2430
53885 게임 이름을 알고 싶습니다 [1] GLukacs2091 09/04/15 2091
53884 USB 무선 랜카드 추천좀 해주세요~ [1] Meanzof1581 09/04/15 1581
53883 유럽에 살면서 유럽섭에서 스타하시는 분 안계시나요? [4] [秋] AKi2154 09/04/15 2154
53882 허벅지 살 빼는 방법은 없나요? [7] 점쟁이2435 09/04/15 2435
53881 아르바이트에 관한 질문.. [3] 카스2167 09/04/15 2167
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로