2012-10-11 2 views
2

char*char*에 할당하려면 strcpy을 사용하면 몇 가지 런타임 메모리 문제가 발생하므로 = operator을 사용하여 간단한 과제로 해결할 수 있습니다. 아무도 메모리 문제를 피하기 위해 strcpy을 사용하기 전에 준비해야 할 사항을 설명 할 수 있습니까?strcpy를 안전하게 사용하는 방법

편집 :

int Function(const char* K,char* FileIN,char* FileOut,int DC) 
{ 
    char *fic_in,*n_fic,*fic_out,*fic_dec; 

    unsigned char k[17]; 

     fic_in = (char*)malloc(60*sizeof(char)); 

     strcpy((char*)k,K); 

     //strcpy(fic_in,FileIN); //I remove this one 
     fic_in=FileIN;   //and replace it by this 
     ... 
+1

http://stackoverflow.com/questions/1258550/why-should-you-use-strncpy-instead-of-strcpy –

+0

대상 char *에 미리 필요한 공간을 예약 하시겠습니까? 참조로 변환 (http://www.cplusplus.com/reference/clibrary/cstring/strcpy/) : "오버플로를 방지하려면 대상이 가리키는 배열의 크기가 원본과 동일한 C 문자열을 포함 할만큼 충분히 길어야합니다 (종료 널 문자 포함), 소스와 메모리에서 겹쳐서는 안됩니다. " – dunadar

+1

기술적 인 어려움으로 인해 일시적으로 마음을 읽을 수 없습니다. 코드를 보여주세요. – Rost

답변

4
const char *a = "string literal"; 
const char *b; 

a은 문자열 리터럴을 가리키는 포인터입니다. b은 특별히 아무 것도 가리 키지 않는 포인터입니다 (초기화되지 않았습니다).

b = a; 

b는 지금 a 포인트 동일한 메모리를 포인트.

char c[100]; 

c은 이제 100 자의 배열입니다. 그 기억 영역은 지금까지 다른 모든 것들과는 완전히 별개입니다.

strcpy(c, a); 

내용 c 메모리 a가 가리키는 바와 같이 (즉, 제 15 바이트)가 이제 동일한 값을 포함. 이제 동일한 문자열 데이터를 포함하는 두 개의 개의 메모리 영역이 개 있습니다.

알다시피, 포인터를 할당하는 것은 strcpy과 거의 공통점이 없습니다. char*char*에 할당하려면 strcpy 근처에 있으면 안됩니다.

C++에 대한 책을 읽는 것이 중요하지만 strcpy의 기본 요구 사항은 대상 포인터가 소스 포인터가 가리키는 문자열에 충분한 공간이있는 메모리 영역을 가리켜 야한다는 것입니다. 아마 당신이 "런타임 메모리 문제"는 당신이 그것을 보장하지 않았기 때문이었습니다. 그래서 당신은 책을 읽을 필요가 있습니다.

+0

이 설명에 감사드립니다. 포인터와 strcpy를 할당하는 것의 차이는 분명합니다. 그러나 내 질문은 strcpy를 사용하는 것과 관련된 문제 였고 어떻게하면 무효화 될 수 있습니까? – Oumaya

+0

@oumaya : it 's 표시된 제한된 코드에서 문제가 무엇인지 정확하게 말할 수는 없습니다. 하지만 대답은 내가 말한 것입니다. 어딘가에서 * 충분한 공간을 확보해야합니다. 이를 수행하는 데는 한 가지 이상의 방법이 있습니다. –

+0

그래, 내 포인트는 하위 트리에 대한 재귀 적으로 디렉토리 트리의 각 파일에 대해이 함수를 호출하고 있으므로 생각하고 여러분이 말한대로 유효한 포인터와 메모리 공간이 필요합니다. :) – Oumaya

3

짧은 답변 : 당신은 모든 strcpy를 사용하지만, 오히려 strncpy 안된다. 후자의 기능은 이 아니며은 후행 \0에 의존하므로 복사를위한 최대 길이를 제공해야합니다.

또한 포인터 할당을 위해 반드시 strncpy이 필요하지는 않습니다. 복사본을 복사 하시겠습니까? 아니면 단순히 포인터를 다시 할당 하시겠습니까? 재 할당을 위해 = 연산자는 완벽합니다.

+0

아마도 유용한 의견 일 수도 있지만 정답은 아닙니다. 라이브러리 함수 대신 포인터 할당을 사용해야하는 경우에는 아무 것도 대답하지 않습니다. – hvd

+0

예, 저는 이것을 분명히하려고했습니다. – Gnosophilon

+0

나는 이것을 + +1하지만 @Gnosophilon은 단순히 char *를 다른 char *에 할당 할 때 어떤 점에서 strncpy * unneccessarily * 필요합니까?=) 내 세상에서는 절대로 =) – WhozCraig

2

char*은 문자열의 문자를 가리키는 포인터입니다. 복사본을 만들려면 먼저 메모리를 할당하고 복사본을 실행해야합니다. 뭔가 같은

size_t l = strlen(src); 
char *dst = malloc(l+1); 
memmove(dst,src,l+1); 

(그리고 malloc이 성공했는지 등등).

귀하의 질문에 c++이라는 태그가 지정되어 있지만 std::string 클래스를 사용하고 약간의 독서를하는 것이 좋습니다. 실제로 작동하는 방식을 이해하는 데 도움이됩니다.

1

수신 버퍼가 끝에있는 '\0'- 문자를 포함하여 원본 문자열에 맞도록 충분히 큰지 확인해야합니다. 그게 진짜입니다.

문자열을 복사 할 수있는 char * 포인터로 표현할 수 있다면 좋지만 항상 가능한 것은 아닙니다.