2012-12-03 2 views
18

내 코드에서 "문자열 리터럴에서 char * 로의 변환이 중단되었습니다"오류가 계속 발생합니다. 코드의 목적은 pointer-to-pointer를 사용하여 string1과 string2에 단어를 할당 한 다음 인쇄하는 것입니다. 이 문제를 어떻게 해결할 수 있습니까? 당신이 법적으로 수정할 수 없음을 의미 const를char문자열 리터럴에서 char * 로의 변환이 더 이상 사용되지 않습니다.

#include <iostream> 
using namespace std; 

struct WORDBLOCK 
{ 
    char* string1; 
    char* string2; 
}; 

void f3() 
{ 
    WORDBLOCK word; 

    word.string1 = "Test1"; 
    word.string2 = "Test2"; 


    char *test1 = word.string1; 
    char *test2 = word.string2; 

    char** teststrings; 

    teststrings = &test1; 
    *teststrings = test2; 

    cout << "The first string is: " 
     << teststrings 
     << " and your second string is: " 
     << *teststrings 
     << endl; 
} 
+1

나는 당신의 코드를 조금 수정했습니다. 스크롤하지 않고 상단에 몇 줄을 추가하여 출력 문을 읽을 수 있도록 출력 문을 작성합니다. –

+0

향후 검색을 위해 중복으로 표시 [지원되지 않는 문자열 리터럴에서 'char \ *'로의 변환] (http://stackoverflow.com/questions/9650058/deprecated-conversion-from-string-literal-to-char) –

답변

39

C++ 문자열 리터럴은 배열 :

여기 내 코드입니다.

암시 적 배열 - 포인터 변환이 포함 된 포인터에 문자열 리터럴을 안전하게 할당하려면 char*이 아닌 대상 포인터를 const char*으로 선언해야합니다. const

#include <iostream> 
int main() { 
    char *ptr = "some literal"; // This is invalid 
    *ptr = 'S'; 
    std::cout << ptr << "\n"; 
} 

A (:

#include <iostream> 

using namespace std; 

struct WORDBLOCK 
{ 
    const char* string1; 
    const char* string2; 
}; 

void f3() 
{ 
    WORDBLOCK word; 

    word.string1 = "Test1"; 
    word.string2 = "Test2"; 

    const char *test1 = word.string1; 
    const char *test2 = word.string2; 

    const char** teststrings; 

    teststrings = &test1; 
    *teststrings = test2; 

    cout << "The first string is: " 
     << teststrings 
     << " and your second string is: " 
     << *teststrings 
     << endl; 
} 

언어 이 제한을 부과하지 않았다 일이 일어날 수 있는지 생각해 여기

은 경고없이 컴파일 코드의 버전입니다) char*을 사용하면 포인터가 가리키는 데이터를 수정할 수 있습니다. (암시 적으로 문자열의 첫 번째 문자에 대한 포인터로 변환 된) 문자열 리터럴을 일반 char*에 할당 할 수 있으면 해당 포인터를 사용하여 컴파일러에서 경고없이 문자열 리터럴을 수정할 수 있습니다. 유효하지 않은 코드 위, 그것은

Some literal 

를 인쇄 할 것이다 근무하는 경우 - 그것은 일부 시스템에서 그렇게 사실 수 있습니다. 그러나 내 시스템에서는 읽기 전용 메모리 (실제 ROM이 아닌 운영 체제에서 읽기 전용으로 표시된 메모리)에 쓰기를 시도하므로 세그먼트 화 오류로 인해 종료됩니다.

(제쳐두고 : 문자열 리터럴에 대한 C의 규칙, C에서 문자열 리터럴은 char의 배열입니다 C++의 규칙과 다른 하지const char의 배열 -하지만이 동작을 보증되지 수정하려고 시도이 있습니다.. C에서 당신은 합법적으로 char *s = "hello"; s[0] = 'H';을 쓸 수 있고, 컴파일러는 불평 할 필요는 없다는 것을 의미합니다. 그러나 실행시 세그먼트 화 오류로 인해 프로그램이 죽을 가능성이 있습니다. 이것은 const 이전에 작성된 C 코드와의 호환성을 유지하기 위해 수행되었습니다. 키워드가 도입되었습니다 .C++는 처음부터 const을 가졌으므로이 특별한 절충안은 필요하지 않았습니다.)

+0

믿을 수 없을만큼 분명하고, 수완이 풍부하며, 계몽 적입니다. 도와 주셔서 감사합니다. 지금은 훨씬 나아졌습니다. –

+0

설명은 훌륭하지만 코드가 분명하지 않고 혼란 스럽습니다. 실제로 teststrings ('test1'을 가리키는 오프셋)과 지적 된 문자열을 인쇄하는 동안 "Test1"과 "Test2"를 인쇄 할 것으로 예상됩니다 (teststrings을 통해'test1'을 수정했기 때문에 "Test2"입니다.) – neuviemeporte

+0

@neuviemeporte : (조금 늦었습니다. 답장을 보내 주시면됩니다.) 필요한 모든'const' 키워드를 OP 코드에 추가하는 것뿐입니다. . 나는 다른 수정이나 개선을 시도하지 않았습니다. –

관련 문제