memcpy에 관해서~~

nadakwon의 이미지

memcpy에서
memcpy(newBuffer, copBuffer, sizeof(copBuffer));

여기서 newBuffer 는 copBuffer보다 싸이즈가 작습니다.

이렇게 된다면 어떠한 현상이 나타나나요?

허접한 질문이긴 하지만 고수님들의 답변 기다리겠습니다.

정말 궁금하거든요.....

서지훈의 이미지

newBuffer에 copBuffer의 내용이 sizeof(copBuffer)만큼 복사가 되겠지요.
근데 어떠한 현상이라 질문을 하시는거 보니깐 제대로 답이 안나오시는가 본데...

show me the source

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

nadakwon의 이미지

컴파일 에러는 나타나지 않네요.....

그리고 프로그램 돌리니까 메모리만 계속 증가하게 되는군요...

memcpy 라는 놈이 그냥 카피를 하는데 다 카피를 하지 않게 되어서 메모리에 남기게 되는거 같습니다.

-+ 아자!! 행복하자 +-

소타의 이미지

memcpy(newBuffer, copBuffer, sizeof(copBuffer));

newBuffer 가 copBuffer 보다 크기가 작다면..
운이 좋으면 그냥 잘 동작 하겠지만 그렇지 않다면 세그먼트폴트가 발생합니다..

운이 좋아서 그냥 잘 작동 하더라도 문제가 생길 수 있습니다. 가령 같은 프로세스 내에서 근접한 메모리가 할당 된 경우에 말이죠..
어쨌든 오류입니다. 방어적으로 그렇게 될만한 코드는 없애는게 후환이 없습니다.
memcpy(newBuffer, copBuffer, (sizeof(newBuffer)>sizeof(copBuffer)?sizeof(copBuffer):sizeof(newBuffer)) );
이렇게만 되도 -.-;;

그런데 sizeof 로 하시는 걸 보니 데이터의 형이 궁금하네요.. 포인터라면 대부분 4만 리턴된텐데.. 스택인듯..?

ssehoony의 이미지

실제는 소타님 말씀 처럼 버퍼를 넘겨서 기록이 되는 경우도 있지만 간단히 말하면 segment fault 가 난다고 생각하시면 됩니다.

위와 같은 실수는 컴파일때는 원래 발견 될 수가 없는거고 런타임때 나타나는데, 그렇다고 위와 같은 잘 못된 코드가 실행되면 무조건 나타는게 아니고 그때 그때 다르다 보니 나중에 디버깅에 애를 먹는 경우가 있죠.
그래서 저런걸 쉽게 잡을 수 있도록 하는게 efence 류의 디버깅 도구들입니다.

ssehoony의 이미지

그리고 하나더

메모리 증가는 memcpy 와는 관련이 없습니다.
memcpy 는 이미 존재하는 메모리 간에 복사를 하는 것이기 때문에 메모리를 새로 할당하지는 않습니다.
메모리 증가는 다른 소스코드에서 발생하는 문제일 것입니다.

moonzoo의 이미지

소타 wrote:

그런데 sizeof 로 하시는 걸 보니 데이터의 형이 궁금하네요.. 포인터라면 대부분 4만 리턴된텐데.. 스택인듯..?

배열일듯.

nadakwon의 이미지

답변 감사드립니다.

저도 예상치 못했던 코드라...난감했었는데요....

고수님들 말씀데로 memcpy 에서는 메모리 증가를 시키지 않더군요....그래도 이놈때문에 다른 놈들이 에러를 발생시킬 요지가 다분하다는것은 맞는거 같습니다.

너무너무 감사드리고......좋은 시간 보내시기 바랍니다.

-+ 아자!! 행복하자 +-

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.