PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/03/26 17:15:47
Name poiuytre
Subject c 언어 질문 드립니다.
#include <stdio.h>

int main(int argc, char *argv[])
{
        double a = 3.14, b = 6.28, c = 9.42;

        double *dr[3];

        int i;

        dr[0] = &a;
        dr[1] = &b;
        dr[2] = &c;


        printf("%5.2lf %u %5.2lf %u\n", a, &a, dr[0][0] , dr[0]);
    // *dr[0]  ==> **(dr+0) ==> *(*(dr+0)+0) ==> dr[0][0]
                return 0;
}
printf에서 3번째로 출력할 dr[0][0]이 3.14가찍히는건 알겠는데
값을바꿔서 dr[1][0]이 6.28로 찍히는거까지도 알겠는데요
dr[1][1]이 3.14로 출력되는 이유가 무엇인지 모르겠습니다.
아시는분 답변좀 부탁드릴게요.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
slowtime
08/03/26 17:29
수정 아이콘
이런 상황에서 a, b, c가 연속된 메모리에 저장된다는 보장은 없으니까,
dr[0][0], dr[1][0], dr[2][0] 말고 다른 배열값은 뭐가 나올지 알 수 없고 (컴파일러 맘대로...), 접근해서도 안됩니다.
(잘못하면 access violation이 나올지도 몰라요.)
김연우
08/03/26 17:37
수정 아이콘
double a,b,c로 스택 내에 메모리 선언하면 주소가 각기 a=12, b=8, c=4 식으로 앞쪽 것이 뒤에, 뒤쪽 것이 앞에 선언됩니다.

그러므로 (&a)+4 = &b가 돼겠죠.

dr[0][0] = &a 입니다.
dr[0][-1] = &b 입니다.

그러므로
dr[1][0] = &b 입니다.
dr[1][1] = &a입니다.
김연우
08/03/26 17:38
수정 아이콘
위에서 말씀하셨듯, 저 상황을 유도하는거 자체가 위험한 일이긴 합니다. 컴파일러나 머신마다 다를 수 있으니.(컴파일러는 그렇게 상관있을거 같지 않아도 CPU는 좀 관련 많을거 같군요)
지구사랑
08/03/26 17:46
수정 아이콘
결론적으로 말하자면, compiler가 stack에 a, b, c를 순서적으로(오름 차순이건 내림 차순이건) 할당하기에 그렇습니다. 때문에 &b를 dr[1]에 할당하면, dr[1][1] => *(dr[1] + 1) => *(&b + 1) => stack 증가 방향에 따라 a 혹은 c가 대응... 이런 겁니다.
조금 더 상세하게 설명하면, 원론적으로 볼 때 위 program은 pointer와 배열을 조금 혼동해서 (잘못) 사용한 경우입니다. 즉, dr은 pointer의 배열로 선언을 했는데 각 원소, 즉 각각이 pointer인 d[0], d[1], d[2]에 값을 줄 때 하나의 변수의 주소 - 각각 &a, &b, &c를 주었다면, 사용시 원칙적으로 *dr[0], *dr[1], *dr[2]로만 이용하는 것이 옳습니다.
dr[0][0] 이 문법적으로 그리고 결과적으로 *dr[0]과 같기는 하지만, 이렇게 사용하려면 애당초 값을 줄 때 배열의 주소를 주던지, 아니면 malloc이나 비슷한 memory allocation 류의 function을 써서 어쨌거나 결과적으로 배열의 주소를 가리키도록 해서 사용하는 것이 옳습니다. 예를 들어 double SOME[10]; 이 선언이 되어 있다면, dr[0] = SOME; 혹은 dr[0] = &SOME[0]; 혹은 dr[0] = &SOME[3]; 이런 식으로 값을 준 후에야 dr[0][n]이 의미를 갖는 거죠. 물론 이 경우도 n이 배열 안이어야 하는 거구요. n이 배열의 크기를 넘어가면 실제로 무엇을 가리킬지는 상황에 따라 다릅니다. core dump될 수도 있고, 아니면 program이 죽지는 않고 위와 같은 현상을 보여줄 수도 있고... 어쨌거나 원론적으로는 bug입니다.
PS) 뒤늦게 김연우님의 답변을 보고 제 답변과 숫자에 차이가 있어서 혹 의문을 가지실까봐 뱀 다리를 답니다. *(&b + 1)에서의 1은 그 다음 원소라는 의미로, 실제 주소 계산에서 1로 번역되는 것이 아닙니다. 즉, 본 예제의 경우에서 pointer의 대상이 double인 바, double이 4byte를 사용하기에 실제 주소 계산(assembly level)에서는 4로 계산되죠.
poiuytre
08/03/26 19:29
수정 아이콘
제대로 배우기 시작한지 1달좀 지났네요..
답변 너무너무 감사하고여..
dr[0][0]과 *dr[0]이 같다라는걸 알려주기위한 코드였기 때문에 혼동(잘못)해서 사용한건 아니에요.
감사합니다.. 자세한 답변에 질문에 궁금증이 해결되었네요.^^
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
35210 이번 주말에 소개팅을 합니다...난생 처음이라... [9] Anarchie2517 08/03/26 2517
35209 서울 토플 학원 추천 부탁드립니다. [1] Daybreaker2219 08/03/26 2219
35207 생쌀을 맥주컵에 담아놓고 나무젓가락꽂아서 들어올리기?? [16] 오락가락2100 08/03/26 2100
35206 영어 공부에 관해 질문~! [4] 한방에열놈1438 08/03/26 1438
35205 타박으로 인한 얼굴 붓기.. [2] 연휘가람2912 08/03/26 2912
35204 대학 공부 질문입니다... [3] worcs2194 08/03/26 2194
35202 KT-KTF 프리미어리그 송병석VS김정민 경기 볼수 있는곳을 아시는분? [1] 악학궤범a1890 08/03/26 1890
35200 성형수술을 하지 않은 미모 여자 연예인은 누가 있나요? [13] 삭제됨2919 08/03/26 2919
35199 일반화학,일반생물강의있나요?? [1] 제로스엠퍼러2084 08/03/26 2084
35198 c 언어 질문 드립니다. [5] poiuytre1518 08/03/26 1518
35197 자퇴를... 하려고 합니다..(조언부탁드립니다.) [7] ^SweetHEart^2269 08/03/26 2269
35196 허벅지, 엉덩이살빼기 뭐가 좋나요? [2] 오락가락2817 08/03/26 2817
35195 필리핀 이주에 대해 궁금합니다. .. ㅠ [2] i`m god1965 08/03/26 1965
35194 집에서 컴퓨터 2대 쓰시는분~ [7] BrOck3371 08/03/26 3371
35192 코피가 엄청 자주 났었습니다 [10] ㅇㅇ/3146 08/03/26 3146
35191 바둑을 배워보려합니다... [5] 아레스2388 08/03/26 2388
35189 지단 스폐셜영상인데요. 배경음악 질문입니다 [7] 낭만토스2671 08/03/26 2671
35186 신문을 보려고 합니다 [15] MidasFan1612 08/03/26 1612
35185 경제학 관련 책 몇권만 추천해주세요. [5] 파렌하잇1876 08/03/26 1876
35184 악기를 하나 배우고싶은데요. [2] 파렌하잇1668 08/03/26 1668
35183 이과에서 문과로 전과할 생각이네요 [7] 마이스타일2327 08/03/25 2327
35182 클래식 공연 중 악장이 끝날 때마다 기침을 하는 이유가 뭔가요?; [4] 루나러브굿2624 08/03/25 2624
35181 유럽팀들의 상대전적을 볼 수 있는 사이트 좀 알려주세요. [9] 리틀세브첸코2785 08/03/25 2785
목록 이전 다음
댓글

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