문제

나는 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);
.

는 정의되지 않은 동작을 초래할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top