[완료] 바이트 배열에 정수형 상수 일부분 복사하는 방법

c_beginner의 이미지

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를 사용하지 않고, 정수형 상수를 넣으면 되지 않나?라는 생각이 들어서 넣어봤는데요. 오류가 발생합니다.

상수를 쓰려면 바이트 하나하나씩 초기화를 시켜야 하는 것은 아닐듯 싶은데요?
무엇이 잘못된건지요?

답변 잘 부탁드립니다.

dazers62의 이미지

성공에선..
&x 라고 하면 x의 주소를 가져와서 카피하는거고

실패에선
메모리 위치 0x102030 에 있는 값을 카피하는것이라

성공시 명령과 실패시 명령은 전혀 다른 내용을 의미하고 있습니다

익명 사용자의 이미지

임의의 메모리 주소값에 접근하는 것은 매우 위험합니다.
위 예제에서 &x가 0x102030은 아니지요. 단지 x의 값이 0x102030일 뿐.

성공한 memcpy에서는 x에 값을 복사하는데 비해
실패한 memcpy에서는 0x102030에 값을 복사하게 됩니다.

c_beginner의 이미지

답변감사드립니다.. ^^

무엇을 잘못한건지는 이제 알겠습니다.
그렇군요.. 변수의 주소를 대입해야 하는데, 상수를 바로 적어서 문제가 생긴것이네요.

그렇다면 어떻게 해야 해결할 수가 있을까요?

상수의 주소를 아는 방법이나..
바이트 배열을 상수로 일괄 초기화 하는 방법은 없는 건가요?

익명 사용자의 이미지

상수는 (적어도 C언어 적으로는) 메모리 상에 실재로 존재하는 객체가 아니므로 주소값을 알 수가 없습니다.
대안이라면 좀 사기이긴 한데 문자열 상수를 이용해서

memcpy(arTest, "\x10\x20\x30", strlen("\x10\x20\x30"));

참고로 문자열 상수는 상수의 부분집합이 아닙니다. 번역상의 문제로 같은 카테고리로 보이는데
원래 이름은 constant랑 string literal이고 실제 개념도 좀 많이 틀립니다.
문자열 상수는 주소값 구할 수 있잖아요 라고 질문하실까봐 미리 적어둡니다.

c_beginner의 이미지

속마음을 읽고 계시는듯 싶네요.. ^^);;
안그래도 문자열 상수는 주소값을 구할 수 있어서 궁금해하던 참이었습니다.

덕분에 조금더 C를 이해하게 되었습니다.
답변 진심으로 감사드립니다... ^^)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.