[완료] 바이트 배열에 정수형 상수 일부분 복사하는 방법
글쓴이: c_beginner / 작성시간: 목, 2012/02/09 - 12:49오후
C를 시작한지 3개월에 접어든 대왕초보입니다. (ㅠㅠ)
책과 여러 사이트에서 조언주시는 분들 덕분에 잘 공부하고 있는데요.
BYTE arTest[3]; int x = 0x102030; // 성공 arTest[0] = 0x30; arTest[1] = 0x20; arTest[2] = 0x10; // 성공 memcpy(arTest, &x, 3); // 실패 memcpy(arTest, (void*)0x102030, 3);
메모리 관련 함수를 공부하던 도중에 위와같이 잘 모르는 경우가 나와서 질문올립니다.
성공이라고 적은 예제들은 책에 나온것인데요. 잘 작동을 합니다.
실패한 것은 예제 작성중 정수형 상수를 공부한 것이 생각나서 굳이 x를 사용하지 않고, 정수형 상수를 넣으면 되지 않나?라는 생각이 들어서 넣어봤는데요. 오류가 발생합니다.
상수를 쓰려면 바이트 하나하나씩 초기화를 시켜야 하는 것은 아닐듯 싶은데요?
무엇이 잘못된건지요?
답변 잘 부탁드립니다.
Forums:
고수는 아니지만..
성공에선..
&x 라고 하면 x의 주소를 가져와서 카피하는거고
실패에선
메모리 위치 0x102030 에 있는 값을 카피하는것이라
성공시 명령과 실패시 명령은 전혀 다른 내용을 의미하고 있습니다
임의의 메모리 주소값에 접근하는 것은 매우
임의의 메모리 주소값에 접근하는 것은 매우 위험합니다.
위 예제에서 &x가 0x102030은 아니지요. 단지 x의 값이 0x102030일 뿐.
성공한 memcpy에서는 x에 값을 복사하는데 비해
실패한 memcpy에서는 0x102030에 값을 복사하게 됩니다.
아...!
답변감사드립니다.. ^^
무엇을 잘못한건지는 이제 알겠습니다.
그렇군요.. 변수의 주소를 대입해야 하는데, 상수를 바로 적어서 문제가 생긴것이네요.
그렇다면 어떻게 해야 해결할 수가 있을까요?
상수의 주소를 아는 방법이나..
바이트 배열을 상수로 일괄 초기화 하는 방법은 없는 건가요?
상수는 (적어도 C언어 적으로는) 메모리 상에 실재로
상수는 (적어도 C언어 적으로는) 메모리 상에 실재로 존재하는 객체가 아니므로 주소값을 알 수가 없습니다.
대안이라면 좀 사기이긴 한데 문자열 상수를 이용해서
memcpy(arTest, "\x10\x20\x30", strlen("\x10\x20\x30"));
참고로 문자열 상수는 상수의 부분집합이 아닙니다. 번역상의 문제로 같은 카테고리로 보이는데
원래 이름은 constant랑 string literal이고 실제 개념도 좀 많이 틀립니다.
문자열 상수는 주소값 구할 수 있잖아요 라고 질문하실까봐 미리 적어둡니다.
아.. 그렇군요..
속마음을 읽고 계시는듯 싶네요.. ^^);;
안그래도 문자열 상수는 주소값을 구할 수 있어서 궁금해하던 참이었습니다.
덕분에 조금더 C를 이해하게 되었습니다.
답변 진심으로 감사드립니다... ^^)
댓글 달기