2012-10-06 3 views
0

가능한 중복 반환 내가 포인터를 사용하여 C 스타일 배열을 선언 한
Can a local variable’s memory be accessed outside its scope?C 스타일의 문자는 잘못된 결과를

, 그리고 그것을 함수에서 반환 값을 할당 . 위의 후

1. const char* str = chArr->readString();

오른쪽, 나는 다음과 같은 STR를 법원하려면 :

2. cout << "pointer to char is = " << str <<endl;

을하고 readString은 다음과 같습니다

char* CharArray::readString() 
{ 
    std::cout << "Insert a string of max 19 length:" <<std::endl; 
    char string[20]; 
    std::cin.getline(string,20,'\n'); 
    return string; 
} 

내가 넣을 때 두 번째 줄에 중단 점, 나는 str 값으로 올바른 결과를 볼 수 있습니다. .. 는하지만 콘솔 창에 아무것도 표시하지 않으며, 2 단계, 나는 str 값을보고 통과 한 후, 그것은 "P÷7"또는 "äû:"같은 것을 보여줍니다

이 STR에 대한 그 말을 어쩌면 가치 I 문자열 길이 4,5. str의 길이에도 불구하고 19 아닙니다.

+0

'const char * str'은 const 포인터가 아닙니다 **입니다. 그것은 const'char'에 대한 가변 포인터입니다. –

답변

5

로컬 변수에 대한 포인터를 반환하고 있습니다. 이 변수의 메모리 주소는 함수가 끝난 후 시스템에서 다시 사용할 수 있습니다. 따라서 일부 다른 코드가 임의의 데이터로 덮어 쓸 수 있으므로 그 이유는 횡설수설입니다. 안전하게이 작업을 수행하기 위해

는 사용

char* string = new char[20];

나중에 delete []에 기억하십시오.

+0

감사합니다. CharArray의 소멸자에서 삭제해야합니까? 또는 어디에? – CjCoax

+0

더 이상 사용하지 않을 때는 메모리를 삭제해야합니다. 이 경우에, 그것은'cout' 이후 인 것으로 보인다. –

3

readString의 범위 내에서 string을 만듭니다. 당신이 돌아 오면 당신의 끈은 파괴 될 것입니다. 이 문제를 피하려면 함수 char *string = new char[20];에 문자열을 할당해야합니다.

+0

그리고 끝내면 해방하십시오. – paxdiablo

4

로컬 변수의 주소를 반환합니다.이 주소는 함수를 종료 한 후 다른 곳에서 재사용됩니다. 이 같은 대신에 표준 : : 문자열을 반환 오프 훨씬 더 있습니다

std::string CharArray::readString() 
{ 
    std::cout << "Type a string and hit enter:" << std::endl; 
    std::string str; 
    std::getline(std::cin, str); 
    return str; 
} 

이는 (적어도이 시점에서 고민 할 필요가 없습니다 당신이 최대 길이에 대해 걱정할 필요가 없습니다 것을 의미합니다 다른 곳에서 부과하려는 다른 제한 사항이있을 수 있음) 메모리 할당은 자동으로 관리됩니다.

+0

건배 야, 포인터로 놀고 있었어! – CjCoax

+0

문제 없습니다. 동적 메모리를 관리하는 방법뿐만 아니라 스마트 포인터 및 RAII (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)에서 반드시 읽어야합니다. –

관련 문제