2016-10-30 3 views
2

한 포인터의 내용을 다른 포인터로 복사하는 데 문제가 있습니다. 나는 * a에 의 내용을 복사 할 수 없습니다. * a의 범프를 제거하면 s의 마지막 문자 만 복사됩니다. 또한 문자열 라이브러리 함수 나 배열 표기법을 사용할 수 없습니다. 형식이 잘못되면 죄송합니다. 첫 번째 게시물입니다. 모든 도움을 미리 감사드립니다.C에서 다른 문자 포인터로 문자 포인터 복사 strcpy없이

char* copy(char *s) 
{ 
    char *a = (char *) malloc(sizeof(char)*length(s)); 
    if (s == NULL) 
    { 
     printf("ERROR: OUT OF MEMORY\n"); 
     return 0; 
    } 
    while(*s != '\0') 
    { 
     *a = *s; 
     s++; 
     a++; 
    } 

    *a = '\0'; 
    return a; 
} 
+2

캐스팅하지 마십시오 malloc의 반환 값, 그것 아무것도 추가하지 않습니다. 'char * a = malloc (sizeof (char) * length (s));'괜찮습니다. 또한 테스트는'if (a == NULL)'('s'가 아님)이어야합니다. – Tibrogargan

+3

'길이'는 무엇입니까? –

+0

@ M.M, 아마 그 자신의'strlen' 함수. – RoadRunner

답변

3

할당 한 포인터의 값을 수정하지 마십시오. 그렇게하면 주소를 잊어 버리고 해제 할 수 없습니다.

char* copy(const char *s) 
{ 
    char *a = malloc(length(s)+1); 
    if (a == NULL) 
    { 
     perror("malloc failed"); 
     return NULL; 
    } 

    char *c = a; 
    while(*s != '\0') 
    { 
     *c = *s; 
     s++; 
     c++; 
    } 

    *c = '\0'; 
    return a; 
} 

아주 간단한 테스트 :에

int main(int argc, char *argv[]) 
{ 
    const char *s = "this is a test string"; 
    char *a; 

    if (NULL != (a = copy(s))) { 
     printf("The copy is: %s\n", a); 
     free(a); 
    } 
} 

결과 :

복사는이 테스트 문자열입니다

+0

BLUEPIXY가 이것을 제안 해 주겠다.하지만 이렇게하면 : char * const a = malloc (length (s) +1)'반환하기 전에 수정하려고하면 컴파일러에서 경고 할 것이다. – Tibrogargan

+0

이러한 변경을 수행 한 후에 * c는 적절한 값으로 채워지지만 * a는 없으며 빈 공간이 반환됩니다. – Makthe2nd

+0

@ Makthe2nd 그것은 c와 같은 메모리 조각을 가리키는 포인터이기 때문에 이상한 행동입니다. 정말로 오타가없는거야? – Tibrogargan