:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 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 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까지 동원하는건;;; 흐흐흐.. 좀 오버겠죠? 힙 메모리까지 들어가면 골치아프니, 여기까지;;
09/04/15 17:19
AhnGoon님// 해당 포인터에 있는 내용을 변경하려고 하면 Access Violation 난다. 하지만 static 으로 선언하면 어떨까?
스 텍 틱 (갑자기 장난기가...)
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:37
MoreThanAir님// AhnGoon님// 감사합니다. ^^
좀더 찾아보니 임베디드하는 분들은 어떻게든 메모리 용량을 줄여보려고 저걸 쓴다고 하는군요. 요새 점점 머리가 깡통이 되어가는 듯;;
09/04/15 17:41
RunDavid님//
char x[8]; strcpy( x, "abcde" ); /* x 배열(스택 버퍼)에 "abcde" 문자열을 복사. */ 로 하시면 됩니다. 물론 배열 크기는, 문자열의 길이보다 길게.. 사족: 간단한 문제에 생각보다 댓글이 많이 붙었네요? 다 제 불찰(응?) 입니다...
09/04/15 17:43
RunDavid님// AhnGoon님이 위에 설명하셨네요. 그럴 경우는 char* x = "abcde"; 이런식이 아닌 char x[MAXNUM]; 이렇게 선언하시고 사용하시면 되겠습니다.
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"; 는 비슷하게 선언한것 같지만 많이 다릅니다. 값의 변경이 필요하다면 배열을 사용하셔야 되겠지요~
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 함수는 서로 달라집니다 ^^
09/04/15 17:59
Claire님// 안되욧... 환경에따라 포팅이 안되는 경우도 많아요... T.T....
RunDavid님// 언어에 따라 약간 약간의 차이는 있지만, 비슷하게 적용 가능 합니다. static fuction은 static 이라는 지시어가 기본적으로 scope를 한정 시키는 것 이기 때문에 static 함수/변수는 정의된 그 함수/변수가 정의된 scope에서만 사용 가능 하게 됩니다. 즉 static 함수는 그 함수를 정의한 파일에서만 호출 가능 합니다.
09/04/15 18:01
chcomilk님// 하기사... 명령어셋이 다르면 작살나기야 하는군요 -_ㅠ;;;;
예전에 드라이버 작업 하다가 그야말로 죽도록 고생한걸 떠올리니...-_-;;;
|