2011-12-26 6 views
0

명령 줄에서 문자열을 할당하려고합니다. 하지만 세분화 오류가 발생했습니다. 왜?C++, char *, 세그먼트 오류

char* ans; 
cout << "enter string: "; 
cin >> *ans; 

갱신 : I는 입력 문자열의 크기를 모르는 경우 어떻게 사전에 메모리를 할당, 그것이 문자열 클래스에서 어떻게 작동하는지 여기 코드는?

답변

3

포인터가 있지만 해당 포인터는 데이터를 저장할 공간이 할당 된 곳을 가리 키지 않습니다. 대신 std::string를 사용

std::string ans; 
cout << "enter string: "; 
cin >> ans; 

// ... 

ans.c_str(); // returns const char * 
1

ans에 메모리를 할당하지 않았기 때문에.
정의되지 않은 동작으로 사용자가 입력 한 문자열이 변수 ans에 속하지 않은 메모리에 기록되고 이로 인해 충돌이 발생합니다. 더 나은 방법은 char * 대신 std::string을 사용하는 것입니다. ans가 초기화되지 코드에서, 그래서 어떤 임의의 메모리 위치를 가리키는 수 -

std::string ans; 
cout << "enter string: "; 
cin >> ans; 
0

당신은에 당신의 문자열을 읽을 수있는 메모리를 할당해야합니다. 그럴 경우 충돌이 발생할 수 있습니다. string을 사용하고 싶지 않은 이유가 있습니까?

+0

:

대신, 뭔가를하려고합니다. char *로하기로 결심했다. 입력 텍스트의 크기를 모르는 경우 어떻게 메모리를 할당합니까? – ashim

+0

@ 마이클 - 당신은 그걸 알 수 없습니다. "충분한"공간을 할당하거나 입력 크기를 어떻게 든 계산하는 것이 가장 좋습니다. –

0
char *ans; 

그것을 초기화하지 않고, 포인터를 정의합니다. 포인터는 단지 일부 저장 영역을 가리키며, 보유하지 않습니다. 그리고 그것을 초기화하지 않고는, 당신이 그것을 역 참조 할 수있는 곳이 없습니다.

당신은 두 가지 작업을 수행해야합니다

  • 일부 스토리지를 할당합니다. 이를위한 정적 변수를 정의하거나 new 키워드를 사용하여 동적 저장소를 사용하십시오.

  • 포인터를이 저장소의 주소로 초기화하십시오.

또는 더 나은 일을 할 수는 전혀 벌거 벗은 포인터로 작동하고 메모리 할당의 모든 세부 사항을 돌볼 것 std::string를 사용하지 마십시오.

0

char*을 사용하면 소유하고 있지 않은 메모리에 쓰기를 시도하고 OS가 응용 프로그램을 중단하여 손상을 입힐 수 있습니다. 난 그냥 플레이

#include <string> 

std::string ans; 
cout << "enter string: "; 
cin >> ans; 

const char* ans_str = ans.c_str();