문제
나는 C++의 const 포인터와 혼동되어 출력이 어떻게 될지 확인하기 위해 작은 응용 프로그램을 작성했습니다.올바르게 작동하지 않는 문자열에 포인터를 추가하려고 시도하고 있지만 프로그램을 실행하면 "hello world"가 올바르게 표시됩니다.이 줄(s += s2)이 어떻게 작동하는지 알아내는 데 도움을 줄 수 있는 사람이 있나요?
내 코드:
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
const char* append(const char* s1, const char* s2){
std::string s(s1); //this will copy the characters in s1
s += s2; //add s and s2, store the result in s (shouldn't work?)
return s.c_str(); //return result to be printed
}
int main() {
const char* total = append("hello", "world");
printf("%s", total);
return 0;
}
해결책
변수 s
내부에 로컬입니다. append
기능.일단 append
함수는 변수가 소멸되었음을 반환하고 더 이상 존재하지 않는 문자열에 대한 포인터를 남깁니다.이 포인터를 사용하면 정의되지 않은 동작.
이 문제를 해결하는 방법에 대한 팁:사용 std::string
모든 방법!
다른 팁
const char*
포인터를 std::string
에 추가하고 가능합니다 (이)참조 ).char*
유형 (C 스타일 문자열)에서 그 조작을 수행 할 수는 없습니다.
그러나 포인터를 로컬 변수에 리턴하므로 append
함수가 리턴되고 스택의 팝업을 시작하면 반환 된 포인터가 가리키는 문자열이 존재하지 않습니다.이로 인해 정의되지 않은 동작이 발생합니다.
class std :: string은 operator +=
유형의 피연산자에 대해 오버로드 된 const char *
basic_string& operator+=(const charT* s);
.
실제로 필요한 경우 추가로 메모리 할당을 할당하는 STD :: String 유형의 오브젝트의 내용에 대한이 포인터가 가리키는 문자열을 추가하기 만하면됩니다.예를 들어 내부적으로 오버로드 된 연산자는 표준 C 함수 strcat
를 사용할 수 있습니다.
개념적으로 다음 코드 스 니펫과 유사합니다.
char s[12] = "Hello ";
const char *s2 = "World";
std::strcat( s, s2 );
.
기능을 꺼낸 후에 로컬 객체를 삭제 한 후 total
가 유효하지 않으면 Program에 정의되지 않은 동작이 있으므로 프로그램이 정의되지 않았 음을 고려하십시오.그래서 다음의 흉상의 다음 statjent
printf("%s", total);
.
는 정의되지 않은 동작을 초래할 수 있습니다.