2012-08-23 2 views
0

내가 다른 문자열에 문자열을 추가하는 기능이 있습니다C++ 오류 메시지 : 잘못된 포인터

char* strjoin(char* str1,const char* str2) { 
    long len1 = strlen(str1); 
    long len2 = strlen(str2); 
    char* result = (char*)malloc(len1+len2+1); 

    memcpy(result,str1,len1+1); 
    memcpy(result+len1,str2,len2+1); 

    free(str1); <--------- program crashes here with error: invalid pointer 
    return result; 
} 

그리고 위의 함수를 호출하는 코드는이 같다 : 함수에서

char* str = "John"; 
str = strjoin(str,"\x20"); 
str = strjoin(str,"Doe"); 

위의 strjoin, 나는 새 문자열에 메모리를 할당하므로 이전 str1을 해제합니다. 왜 str1이 유효하지 않은 포인터입니까?

+5

당신은 할 수없는'free' 뭔가를. 또한 이것은 기본적으로 C 코드이므로 C++ 기능을 사용해야합니다. – GManNickG

+1

'char * str = "John";'컴파일러는 여기서 비추천적인 변환에 대해 경고해야합니다. 경고를 무시하지 마십시오! – Praetorian

답변

5

join의 첫 번째 호출에서는 문자열 리터럴에 대한 포인터를 읽기 전용으로 free으로 전달합니다. 해방 될 메모리를 할당하지 않는 한 free으로 전화해서는 안됩니다.

당신은 strdup를 사용하여 발신자에이 문제를 해결 할 수는 없습니다`malloc`했다

char* str = strdup("John"); 
str = strjoin(str,"\x20"); 
str = strjoin(str,"Doe"); 
+0

오, 그래, 초기 문자열은 문자 리터 – jondinham

+0

감사합니다. strdup가 문제를 해결합니다. strdup 함수 안에 malloc이있는 것 같습니다. – jondinham

+1

@PaulDinh 예, 'strdup'는 malloc's이고 memcpy는 단일 호출의 문자열입니다. – dasblinkenlight