2012-01-16 4 views
0

이 장난 프로그램이 있습니다.std :: string의 이상한 동작

#include <iostream> 
#include <string> 
int main() 
{ 
    std::string st = ('='+"10"); 
    std::cout<<st<<"-"<<st.c_str(); 
    return 0;  
} 

실행하지 않고 예상되는 출력의 종류는 무엇입니까?

나는 점점 오전 : -

내가 :: 정신 라이브러리를 부스트를 사용하는 동안 이러한 문제로 실행하고 C-문자열로 주위의 출력을 전달하고있다.

나는 뭔가를 놓친가요? gcc 4.6.1 (우분투 10.10)을 사용하고 있습니다.

+1

인접한 문자열 리터럴은 컴파일러에 의해 결합됩니다 :' "=" "10"''= 10 "'(C++ 03, § 2.13.4-3). – outis

답변

3

이 :

'=' + "10" 

은 아마 당신이 무엇을 기대하지 않습니다. 연결하는 것보다는 "="의 "ASCII"값을 버퍼 오버런 인 리터럴 문자열 "10"에 대한 포인터에 "추가"하여 (산술적으로) 정의되지 않은 동작을 호출합니다.

valgrind에서 프로그램을 실행하면이 문제에 대해 불평 할 것입니다.

대신, 시도 :

std::string st = "="; 
st += "10"; 
+0

그 이상! 나는 st + = "10"이'st = st + "10으로 확장한다고 생각했습니다. – Dilawar

+3

@Dilawar :' '=''는 문자열이 아닌 문자입니다. 또한 c- 문자열을 추가해도 연결되지 않습니다. 그러므로 John의'+ ='사용. – outis

+0

맞습니다, 그 두 가지는 동등합니다. 그러나 "="대신 "="을 쓰고 std :: string에 C 문자열 리터럴 "10"을 추가했지만 char에 추가했습니다. –

1

대신보십시오 :

#include <iostream> 
#include <string> 
int main() 
{ 
    std::string st = ('='+std::string("10")); 
    std::cout<<st<<"-"<<st.c_str(); 
    return 0; 
} 

"10"const char* (포인터)입니다. 그것에 추가하면 표준 정수 연산을 사용하여 포인터를 증가시키고 문자열을 연결하지 않습니다.

+0

나는 컴파일러가 경고를 제기해야한다고 생각한다. 나는 - 벽으로 컴파일하고 있었다. – Dilawar

+0

경고가 필요하지는 않지만 포인터를 증가시키는 것은 C/C++에서 일반적인 관행이며 그 자체로 유효합니다. 문제는 잘못된 주소를 만들고 컴파일러에서 알 수없는 문자열 생성자에 전달하는 것입니다. –

+0

@TimGee : 공평하게 말하면 컴파일러는 '='+ '10 "(문자열의 길이 이상으로 문자열 리터럴에 대한 포인터를 증가 시킴)에 대해 확실히 경고 할 수 있습니다. 아직 컴파일러가 없다면 놀라지 않을 것이지만 절대적으로 그렇게 할 수 있습니다. –