2012-06-24 4 views
0

저는 자체 strcpy 프로그램을 구현해야하는 'C'함수가 있습니다. 여기에 내가 쓴 것이있다. 그러나 세그멘테이션 오류의 원인을 디버그 할 수 없습니다.C 함수에서 문자열 복사를 시도하는 중 세그먼트 오류가 발생했습니다.

#include <stdio.h> 
#include <stdlib.h> 

char * mystrcpy(char *dest, char *src) { 
    char * ptr = dest; 
    while (*src != '\0'){ 
     *ptr = *src; 
     ptr++; src++; 
     //printf("Dest is \"%s\" and Source is \"%s\"\n",dest,src); 
    } 
    *ptr = '\0'; 
    return dest; 
} 


int main() { 
    char str[] = "I rock always"; 
    char * dest = NULL; 
    dest = mystrcpy(dest, str); 
    printf("Source String %s and Destination String %s\n", str, dest); 
} 

누군가이 동작을 내게 설명 할 수 있습니까?

+2

의 strcpy의 한 줄 K & R 버전이 있습니다 :'동안 (* 이명 령 ++ = * STR ++) { ;}'못생긴 일 이겠지만 선행 규칙을 이해하는 법을 배우는 좋은 방법입니다. – wildplasser

+0

목표는 전체 문자열을 복사하는 것이므로 추측합니다. 이 '\ 0'체크를 벗어나 목적지 문자열에 복사되도록하는 것이 합리적입니다. 그렇다면 질문은 언제 멈출지를 알고 있습니까? – Code4Fun

+0

'세그멘테이션 오류의 원인을 디버그 할 수 없습니다.'- 분명히 시도하지 않았기 때문에. –

답변

1

*dest이 가리키는 메모리를 절대로 할당하지 마십시오.

NULL을 가리 키기 시작하고 시도하면 *ptr = *src입니다.

4

당신은 대상 문자열에 대한 메모리를 할당 할 필요가 :

free(dest); 
+1

1) 캐스트는 필요하지 않습니다. 2) strlen()은 필요하지 않습니다. sizeof도 할 것입니다. – wildplasser

+0

@wildplasser - 1) 사실이지만, 현악 컴파일러에서 경고를 방지 할 수 있습니다. 2) 또한 사실이지만, 이것은 좀 더 일반적인 것입니다 :'malloc'을'mystrcpy' 함수로 옮기고 싶은데'sizeof'가 작동하지 않을 수 있습니다. – rodrigo

+2

1) "페터 틱 컴파일러"? 당신은 C++ 컴파일러를 의미합니까? 2)이 경우 그는 그의 기능을 mystrdup()라고 부를 수 있습니다. – wildplasser

0

당신은 대상 문자열 버퍼 메모리를 할당해야합니다 물론

int main() { 
    char str[] = "I rock always"; 
    char * dest = (char*)malloc(strlen(str) + 1); 
    dest = mystrcpy(dest, str); 
    printf("Source String %s and Destination String %s\n", str, dest); 
} 

, 결국 메모리를 해제하는 좋은 매너입니다 .

메모리 관리는 C의 매우 큰 부분을 차지합니다. 메모리를 할당하고 사용량이 많아지면 메모리를 할당 취소해야하므로 요구 사항에 과도하게 소모됩니다. 그렇게하지 않으면 세그먼트 화 오류 (메모리 할당 실패)와 메모리 누수 (메모리를 확보하지 못함)가 발생합니다.

기타 답변은 malloc의 예제를 제공하므로 여기에서 반복하지 않겠습니다.

직접 작성하지 말고 가능한 한 많이 사용 가능한 기능을 사용해야합니다. 이렇게하면 누군가가 이미 디버깅하고 최적화 한대로 구현 오류를 피할 수 있습니다.

http://www.cs.cf.ac.uk/Dave/C/node19.html

+0

예 ... 절대적으로 사실입니다.저는 코드 작성을 배우는 중입니다. 그래서 언젠가는 견고한 라이브러리를 개발할 수있을 것입니다. – Code4Fun

0

메모리를 할당 시도 ....

  #include <stdio.h> 
     #include <stdlib.h> 

     char * mystrcpy(char *dest, char *src) 
     { 
        char * ptr = dest; 
        int index=0; 
        while (*src != '\0') 
        { 
         *(ptr+index) = *(src+index); 
          index++; 
        } 
        *(ptr+index) = '\0'; 
        return dest; 

      } 




      int main() 
      { 
       char str[] = "I rock always"; 
       char * dest = (char*)malloc((strlen(str)+1)*sizeof(char)); 
       dest = mystrcpy(dest, str); 
       printf("Source String %s and Destination String %s\n", str, dest); 
       free(dest); 
       return 0; 
      } 
0
#include <stdio.h> 

    /* this the K&R version of strcpy */ 
char * mystrcpy(char *dest, char *src) { 
    char *ptr = dest; 
    while (*ptr++ = *src++) {;} 

    return dest; 
} 


int main(void) { 
    char str[] = "I rock always"; 
    char dest[sizeof str]; 
    char *result; 

    result = mystrcpy(dest, str); 
    printf("Source String %s and Destination String %s and result %s\n", str, dest, result); 
    return 0; 
} 
관련 문제