22018, 1/1101 회원가입  로그인  
   SoftDevil
   C언어 질문 입니다!!!

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=20037 [복사]


C언어에서 컴퓨터 시스템 비트에 따라 한 변수에 주소 값을 저장 할 수 있는 메모리를 할당받는 걸로 알고 있는데요.

그 문제로 예를 들어서 printf()함수에서 ()안의 문자열은 일단 메모리에 저장되어 사용되기 때문에 주소값 또한 할당 받게 되는걸로 알고 있습니다. 그렇다면 문자열에 쓴 글이나 숫자들은 어디에 저장이되는 것인가요? 주소 값을 저장하기 위해 할당된 메모리 공간에 같이 저장하게 되는건가요? 아니면 주소 값을 저장 할 수 있는 메모리 공간 따로 글이나 숫자같은 값들을 저장하는 메모리 공간따로 이렇게 구분된 두개의 메모리 공간을 갖게 되는 것인가요?

공부하다가 위 예를 변수(배열, 포인터 제외)의 자료형의 따라 저장 할 수 있는 메모리의 크기가 할당이 되고, 같은 변수에 주소 값을 저장하기 위해 주소 값을 저장 할 수 있는 메모리의 크기가 시스템 비트에 따라 할당 받을수 있다는 걸 알게 되니 많이 헷갈리게 되네요.. ㅠㅠ 왠지 제가 정리가 안되서 이해를 못하는것 같은데.. 쉽게 설명 좀 해주세요~!

  Hit : 10689     Date : 2011/02/28 04:42



    
ggabu420 printf("%s",~~); 등으로 쓸 때 사용되는 "%s" 와 같은 리터럴 문자열의 경우
보통 쓰기 불가능한 데이터 영역에 저장이 됩니다.

과거에는 이 영역이 반드시 쓰기 불가능한 영역에 저장되지는 않았습니다.
그러나 요즘 컴파일러는 대부분 이 영역의 쓰기 권한을 없게 만들어 놓았습니다.

보통 .data 또는 .rodata 등으로 불리는 섹션에 따로 저장이 됩니다.
가령 char *str="d0lphin is not genius!" 이라는 선언문이 있을 경우
데이터 섹션에 "d0lphin is not genius!" 라는 문자열이 있고,
str 변수에는 해당 문자열이 위치하는 곳의 시작 주소가 들어가게 되는 것입니다.

같은 예로 char str[]="d0lphin is not genius!" 처럼 하면 자동으로 이 코드는
해당 문자열의 시작 주소부터 끝까지 해당 변수가 선언된 함수의 지역변수 영역에
str 배열의 시작부분부터 쫙 복사하는 것입니다.

지금 무엇을 헷갈려하시는지를 잘 모르겠는데, 포인터 변수의 크기는 타입에 관계없이
항상 빌드 타겟 CPU의 버스 크기로 결정이 됩니다. 주소와 관계된 변수가 아닌 다른 변수들의
경우 별 상관이 없습니다.
2011/02/28  
두루뭉술 역시 세화님 2011/02/28  
ganesha 돌핀이즈 낫 지니어스 ㅋㅋㅋㅋㅋㅋ 2011/02/28