[완료] 도대체 memcpy와 strcpy의 차이가 뭐길래...

elite4549의 이미지

안녕하세요!

제가 이번에 파일전송 프로그램을 실습하다가 strcpy를 써서 패킷의 data를 임시저장(손실시 재전송을 위해)을

똑같은 size의 배열에 저장했는데요.

이렇게 했는데 작은 파일은 되는데 큰 파일은 보내다가 중간에 세그멘테이션 폴트를 발생시키더라구요.

어떻게 해도 안되서 memcpy를 썻더니 정상적으로 작동하는거 아니겠습니까?

도대체 둘의 차이가 뭐길래 이런 차이가 발생하는 것일까요?

고수님들의 조언 부탁드리겠습니다.

dorado2의 이미지

string이 아닌 패킷 저장/복사에 strcpy를 사용하지 마세요.

데이터 중간에 '\0' 값이 있으면 복사를 멈추게 됩니다.

반면 memcpy는 지정된 크기만큼 복사를 하지요.

elite4549의 이미지

파일에서 읽은 data중에 \0이 있으면 복사를 멈춘다는 말씀이시군요
새로운 사실을 알았습니다..

그 경우가 세그멘테이션 폴트를 발생하는 경우가 될수도 있나요?

planetarium의 이미지

strncpy() 가 아닌 strcpy() 를 사용하셨다면, 반대로
배열의 끝에 '\0' 이 없었기 때문에 배열의 범위를 넘어가서 복사하다가 세그폴트가 났을 가능성이 높습니다.

작은따옴표를 빼먹으셨길래 혹시나 하고 덧붙이면
'\0' 은 0과 같고 '0' 과는 다릅니다.

bushi의 이미지

strcpy(x, y) 를 memcpy(x, y, strlen(y)) 로 생각해보세요.
\0 이 없을 때 어떻게 동작할 지 아무도 모릅니다.
segfault 가 나기만을 빌어야되는 상황이죠. 디버깅이라도 후딱하려면.

OTL

alwaysN00b의 이미지

윗 분들 답변처럼 복사대상 소스에 널값이 없어 계속 복사하다가, 복사 타겟부분의 쓰기 불가능 영역까지 접근해서 나는 세그먼트 폴트 같습니다.

언제나 시작

elite4549의 이미지

제가 이제서야 답변을 확인했네요.
좋은 가르침 얻고 갑니다. 감기 조심하세요~~

댓글 달기

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