2013-08-03 6 views
2

다른 사용하여 포인터를 하나 개의 char 배열을 추가 origText = "ABC", 붙여 넣기 = "DEF" 기능 후 : origText = "ABCDEF" , paste = "def"제대로 작동 나는이 같은 기능이

그래서 두 문자열을 하나로 병합했습니다. 이 기능을 사용할 때 : 함수 외부

char* add (char* origText,char *paste) 
{ 
    int newLength = strlen(origText) + strlen(paste)+ 1; // + '\0' 
    char* newText = new char[newLength]; // we want to make sure that 2 strings will fit. 

    char* pointerToNewText = newText; // pointer to char array where we will merge strings 
    char* helpPointer = origText; // helps us count until '\0' 

    while (*helpPointer!='\0') 
    { 
     *pointerToNewText=*helpPointer; 
     *pointerToNewText++; *helpPointer++; 
    } 

    while (*paste!='\0') 
    { 
     *pointerToNewText=*paste; 
     *pointerToNewText++; *paste++; 
    } 

    *pointerToNewText='\0'; 

    origText = newText; 

    // cout <<origText<<endl; 
} 

출력은 다음과 같습니다 origText = "ABC", 붙여 넣기 = "DEF" 기능 후 : origText는 = "ABC", 붙여 넣기 = "데프"

I 내 책은 그것이이 줄 때문이라고 설명했습니다 :

char* newText = new char[newLength]; 

그러나 나는 그것을 얻지 못합니다. 함수에서 메모리 할당이 포인터 origText에 영향을주는 이유는 무엇입니까?

+1

원본 메모리에 충분한 메모리가 있으면 좋겠어. 그렇지 않으면 메모리가 손상됩니다. – xanatos

+5

'std :: string'을 사용하십시오. 전체 함수 정의는이를 사용하여 한 줄로 작성 될 수 있습니다. 당신의 책이 당신이 쓴 방법을 추천한다면, 또 다른 좋은 책을 골라야합니다. – Mahesh

+1

@Mahesh +1이 책은 너무 많은 수준에서 틀린 것처럼 보입니다. – stijn

답변

4

을 반환하지 않습니다 참조 origText을 통과 전달 된 변수와는 별도의 변수입니다. 따라서 여기에 (origText = newText과 같은) 이 아닌 것은이 호출자의 변수에 영향을 미칩니다. 지금

char* // That's the function's return type: it must return that 
add(const char* origText, // Added const: the function doesn't change this string 
    const char* paste) // And again 
{ 
    // Your code (with a bit more const), followed by 
    return newText; 
} 

당신이 함수를 호출 할 때, 당신은 반환 값 사용할 수 있습니다 :

const char* origText = "abc"; 
const char* paste = "def"; 

char* newText = add(origText, paste); 

std::cout << origText << std::endl; // abc - unchanged 
std::cout << paste << std::endl; // def - unchanged 
std::cout << newText << std::endl; // abcdef - result of concatenation 

delete [] newText; // Don't forget to delete whatever you create with new. 

를이 새로운 문자열로 포인터를 반환하기로했다처럼

대신, 함수가 보인다 이 모든 불쾌한 메모리 관리가 어떻게 작동하는지 이해하고 나면 std::string 클래스를 사용하여 모든 것을 할 수 있습니다.

std::string origText = "abc"; 
std::string paste = "def"; 
std::string newText = origText + paste; // Does exactly what you think it does. 
1

* pointerToNewText ++; * helpPointer ++;

* pointerToNewText ++; * paste ++; // 잘못되었습니다. 포인터가 가리키는 값만 증가했습니다.

origText = newText; // 쓸데없는.

당신은 코드 아래 사용해야 코드에서

char* add (char* origText,char *paste) 
{ 
    int newLength = strlen(origText) + strlen(paste)+ 1; // + '\0' 
    char* newText = new char[newLength]; // we want to make sure that 2 strings will fit. 

    char* pointerToNewText = newText; // pointer to char array where we will merge strings 
    char* helpPointer = origText; // helps us count until '\0' 

    while (*helpPointer!='\0') 
    { 
     *pointerToNewText=*helpPointer; 
     pointerToNewText++; helpPointer++; 
    } 

    while (*paste!='\0') 
    { 
     *pointerToNewText=*paste; 
     pointerToNewText++; paste++; 
    } 

    *pointerToNewText='\0'; 

    return newText ; 
} 
1

문자열의 주소 origText 가치로 패스입니다, 그것은 지역 변수 그래서. 라인 origText = newText;은 바깥 쪽의 실제 포인터를 변경하지 않습니다. 원래 포인터 포인터에 의해 전달 변경해야하거나 사용은

char* add (char** origText,char *paste) 

*origText = newText; 

또는

char* add (char*& origText,char *paste) 

origText = newText; 

또한이 코드는 함수 내부에서 아무것도

0

함수에서 메모리를 할당하는 것이 포인터 origText에 영향을주는 이유는 무엇입니까?

이 버전의 함수는 원래 문자열 뒤에 메모리에 저장된 내용을 덮어 쓰기 만하면 원래 문자열에 여분의 텍스트를 추가합니다. 중요한 것은 아무 것도 없거나 충돌을 일으키거나 보안 문제를 일으킬 수 있습니다. 올바른 해결책은 새 결합 문자열을 보유하고 두 문자열을 모두 복사 할 수있을만큼 큰 새 메모리 조각을 할당하는 것입니다.

관련 문제