[완료] 도대체 memcpy와 strcpy의 차이가 뭐길래...
글쓴이: elite4549 / 작성시간: 목, 2009/12/03 - 10:31오전
안녕하세요!
제가 이번에 파일전송 프로그램을 실습하다가 strcpy를 써서 패킷의 data를 임시저장(손실시 재전송을 위해)을
똑같은 size의 배열에 저장했는데요.
이렇게 했는데 작은 파일은 되는데 큰 파일은 보내다가 중간에 세그멘테이션 폴트를 발생시키더라구요.
어떻게 해도 안되서 memcpy를 썻더니 정상적으로 작동하는거 아니겠습니까?
도대체 둘의 차이가 뭐길래 이런 차이가 발생하는 것일까요?
고수님들의 조언 부탁드리겠습니다.
Forums:
string이 아닌 패킷
string이 아닌 패킷 저장/복사에 strcpy를 사용하지 마세요.
데이터 중간에 '\0' 값이 있으면 복사를 멈추게 됩니다.
반면 memcpy는 지정된 크기만큼 복사를 하지요.
아 감사합니다.^^
파일에서 읽은 data중에 \0이 있으면 복사를 멈춘다는 말씀이시군요
새로운 사실을 알았습니다..
그 경우가 세그멘테이션 폴트를 발생하는 경우가 될수도 있나요?
strncpy() 가 아닌
strncpy() 가 아닌 strcpy() 를 사용하셨다면, 반대로
배열의 끝에 '\0' 이 없었기 때문에 배열의 범위를 넘어가서 복사하다가 세그폴트가 났을 가능성이 높습니다.
작은따옴표를 빼먹으셨길래 혹시나 하고 덧붙이면
'\0' 은 0과 같고 '0' 과는 다릅니다.
strcpy(x, y) 를 memcpy(x,
strcpy(x, y) 를 memcpy(x, y, strlen(y)) 로 생각해보세요.
\0 이 없을 때 어떻게 동작할 지 아무도 모릅니다.
segfault 가 나기만을 빌어야되는 상황이죠. 디버깅이라도 후딱하려면.
OTL
윗 분들 답변처럼
윗 분들 답변처럼 복사대상 소스에 널값이 없어 계속 복사하다가, 복사 타겟부분의 쓰기 불가능 영역까지 접근해서 나는 세그먼트 폴트 같습니다.
언제나 시작
답변주신 분들 감사드립니다.
제가 이제서야 답변을 확인했네요.
좋은 가르침 얻고 갑니다. 감기 조심하세요~~
댓글 달기