여기서 9번째줄에서 %d번째 문자열: %d 에서 두번쨰 %d가 원래 %s여야지 이 책에서 준거랑 똑같이 실행이되는데
그냥 %d놓고 해보니깐 주소가 5개씩 올라가는데요
왜그런가요?
포인터이면 4개씩 차이 낳잔야요
Hit : 4474 Date : 2011/02/15 12:26
$Zero
포인터를 잘못이해하고 계시네요 ..
위 프로그램에서 포인터가 4바이트란것은 전혀 관계없는 내용입니다.
매개변수를 전달받아서 그 문자열들을 출력하고 각 문자열들의 주소를 출력하겠군요 .. ?
매개변수로 qer 을 보냈다고 칩시다.
제가 실행한 파일 명은 project1이니 제일 첫번째로 argv[0]엔 project1이 들어갔을겁니다.
이건 총 몇글자죠 ? 8글자입니다. 그리고 뒤에 널문자를 붙이면 총 9글자겠죠 ?
이 문자열의 시작주소가 10이라고가정했을때 10부터 시작해서 총 9바이트를 차지할겁니다.
그리고 다음 argv[1]을 저장합니다. 그럼 총 9바이트를 건너뛴 부분부터 저장해야 순서대로 저장하는거겠지요 ?
그러니 20부터 시작해서 저장하는것입니다.
10~19주소까지 차있으니 20 주소부터 비어있겠지요 ?
이해가 가시나요 ? 위 프로그램에서 주소차이가 나는건 문자열의 길이때문입니다.
모든 데이터가 4바이트로 저장되는게 아닙니다.
위에서 말한 주소10이 4바이트인것이지 문자열이 4바이트는 아니란겁니다.
주소값 = 4바이트
문자열 = 길이에따라 달라짐 .
포인터설명은 저도 참 어떻게 해야할지 모르겠네요 .. 쩝
2011/02/15
$Zero
추가)
argv[0]은 project1이라는 문자열의 주소를 가리키는 포인터입니다.
argv[0]=0x10 이라고 합시다.
더블포인터이기때문에 argv[0]을 %d로 표현할경우 argv[0]이 가지고 있는 주소값을 뱉습니다.
이 주소값은 문자열이 저장되어있는 주소이구요 . 문자열은 총 9바이트로 저장되어있고 주소값은 0x10입니다.
0x10 ~ 0x19까지 문자열이 저장되어있다는거죠 .
(그러므로 당연히 argv[1]은 주소 0x1a부터 시작하게 됩니다)
%s로 표현할경우 %s자체가 주소로 접근하는 식별자이기 때문에 argv[0]이 가진 주소로 접근해서 문자열을 빼오는것입니다.