memcpy 와 strncpy의 차이점은 무언가요??
글쓴이: passion / 작성시간: 금, 2003/10/24 - 4:37오후
구조체 멤버(insca.st_code : insca는 global로 선언된 구조체명 )에서
구조체 멤버(xx_insca->st_code : xx_insca 는 인자로 넘겨온 구조체형 char pointer) 로 copy를 하는데 memcpy를 하면 xx_insca->st_code의 값은 물론이고 그 뒤로부터 값들이 원치않는 값으로 깨지거나 밀려서 출력됩니다.
물론 구조체 멤버의 길이는 모두 같습니다.
하지만 strncpy를 이용해서 copy를 하면 제값이 제대로 복사되어 올바른 값이
나오는 데 memcpy와 strncpy의 특별한 다른점이 있습니까?
아니면 사용상의 주의가 필요한 점이라도....
부탁드립니다. 몇일을 낑낑대고 있답니다. :roll:
Forums:
memcpy 호출과 strncpy 호출부를 보여주시면 좋겠네요.
strncpy 는 n 개의 문자이전에 null 문자가 들어오면 복사를 끝내는 것 이외에는 제가 아는 차이점은 없습니다.
조금 차이점은 있죠 -_- strcpy는 널 검사를 하기때문에
조금 차이점은 있죠 -_-
strcpy는 널 검사를 하기때문에
좀 느리고
memcpy는 메모리크기를 받아 그거대로 바로 복사하기때문에
더 빠르다는거......
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
이렇게 사용했습니다.
MAKE_SAM(NGS_SAM *XX_NGS_SAM)
{
memcpy(INSCA.ST_EXPRO_TICKET,
XX_NGS_SAM->ST_EXPRO_TICKET,
sizeof(XX_NGS_SAM->ST_EXPRO_TICKET ));
memcpy(INSCA.ST_MANUA_TICKET ,
XX_NGS_SAM->ST_MANUA_TICKET,
sizeof(XX_NGS_SAM->ST_MANUA_TICKET ));
}
NGS_SAM 은 구조체 명으로서 header 화일에 선언되어 있으며,
INSCA 역시 구조체 명이고 이것 역시 header화일에 선언되어 있습니다.
함수 MAKE_SAM은 다른 sub-function에서 NGS_SAM 형태로 주소값을 받습니다.
이때 넘겨온 NGS_SAM 형태의 화일 record를 구조체 INSCA 에 일부를 넣고 싶은데 memcpy와 strncpy의 차이로 인해 난항을 격고있습니다. NGS_SAM 형태의 화일레코드를 확인차 각각의 멤버값을 출력해봤을때 값의 오류는 없었습니다. 하지만 그 값들을 INSCA의 같은이름의 멤버에 copy를 할때면 값이 깨지거나 밀리네요..
그냥...
memcpy
strncpy
From BSD.
There is more than one way to do it...
Re: 이렇게 사용했습니다.
다음과 같이 바꿔보세요..
MAKE_SAM(NGS_SAM *XX_NGS_SAM)
{
memcpy(&INSCA.ST_EXPRO_TICKET,
&XX_NGS_SAM->ST_EXPRO_TICKET,
sizeof(XX_NGS_SAM->ST_EXPRO_TICKET ));
memcpy(&INSCA.ST_MANUA_TICKET ,
&XX_NGS_SAM->ST_MANUA_TICKET,
sizeof(XX_NGS_SAM->ST_MANUA_TICKET ));
}
꿈은 이루어진다.
[quote="mastercho"]조금 차이점은 있죠 -_- st
만들기 나름입니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
[quote="전웅"][quote="mastercho"]조금 차이점은 있
만약 그런 library가 있다면.. de facto standard에서 어긋나는 거지요... memcpy, bcopy가 NULL이라고 copy를 안 해도 마찬가지구요.
확인 부탁드립니다.
[code:1]7.21.2.4 The strncpy function
제 생각에도 null character 체크를 해야 할것 같습니다.
실제로 FreeBSD libc와 glibc-2.3.2에서도 그렇게 하고 있군요..
PS. 생각해 보니 카피하고 나서 체크후 지워도 될 꺼 같다는 생각도 드는군요;
음.. 저 괄호속 문장이 src와 dst를 결과적으로 비교할 때 성립해야 한다는 건지,
아니면 카피하는 행위 자체를 하지 말라는 건지 헷갈리네요. 어느 경우에건 한번
이상의 null character 체크는 해야 하겠지만요.
----
Let's shut up and code.
[quote="windy96"]전웅님 말씀은 NULL 검사를 하지 않는
짧은 제 글이 오해를 불렀네요. "성능" 에 대한 단정이 있어서는 안 된다는
뜻이었습니다. strncpy 와 memcpy 사이의 선택은 "성능" 이 아닌 "기능" 에
의해 이루어져야 합니다. <string.h> 함수들의 명칭이 갖는 prefix (str,
strn, mem) 는 (물론, 역사적 전통을 가지고 있는 것들이지만) 기능에 의존
하여 group 되어 있습니다.
참고로, C 문맥에서 NULL 은 null character 가 아니라 null pointer
constant 를 의미합니다.
만약, str* 함수들이 null character 검사를 하지 않는다면 (혹은 그런 것
처럼 작동한다면) de facto standard 뿐 아니라 de jure standard 도 지키
지 않은 것입니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
이유를 모르겠군요.
passion 씨가 작성하신 것과 linuxs 씨가 작성하신 code 가 다르게 동작하나요?
memcpy 가 잘못되는 이유를 모르겠습니다.
질문이 있는데 st_code member 는 당연히 char 배열인가요?
혹시 char * 를 쓰시는 것은?......
물론 적당히 동적할당하고 해제해주면 문제는 없겠습니다만...
linuxs 님이 작성하신 것이 제대로 동작한다면 좋겠지만 안된다면 INSCA 구조체 template 정의부가 보고 싶군요.
댓글 달기