2013-11-03 2 views
0

내 프로그램에서 문자열의 크기를 얻으려고하므로 나중에 루프를 사용하여 char로 변환 할 수 있지만 프로그램이 리턴하는 크기는 5입니다. 실제 크기보다 작은 숫자. 왜 이런 일이 일어날까요?C++ sizeof() 올바른 크기를 반환하지 않습니다

theFileName = "C : \ 사용자 \ 빈센트 \ 바탕 화면 \ untitled.txt가"

을 그리고이 크기 :

std::string theFileName = fileNames[ curTab ]; 
int size = sizeof(theFileName); 

내 프로그램을 디버깅, 그것은이 theFileName에 저장

크기 = 32

파일 이름의 문자 수를 계산하면 실제로 37이됩니다.이 문제의 원인은 무엇입니까? MS Visual C++ 2010 Express를 사용하여 메모장 프로그램을 만듭니다.

+6

'크기'기능을 사용하십시오. 'sizeof'가 무엇을하는지보십시오. – chris

+1

@Vince : 처음에 그 목적으로'sizeof'를 사용할 수 있다고 생각하게 된 이유는 무엇입니까? 'sizeof'의 스펙을 읽었습니까? 아니면 "sizeof"가 "옳은 것"이라고 결정 했습니까? – AnT

+0

왜 내가 그렇게 생각하는지 모르겠습니다. 나는 그것을 위해 스펙을 찾지 않았다고 생각한다. 나는 이것을 바보처럼 보이게해야한다 : P – Vince

답변

0

std :: string 개체의 크기는 포함 된 문자열의 크기와 관련이 없습니다. 이 목적을 위해 제공된 std :: string 멤버 함수를 사용하십시오.

1

std::string은 문자 배열이 아닙니다. 동적 배열이 std::string 개체에 의해 관리되고 있습니까? sizeof은 string의 경우 배열에 대한 포인터와 정적으로 할당 된 문자의 양을 더한 지정된 데이터 유형의 크기를 반환합니다 (일반적인 문자열 최적화와 동일).

내장 함수 인 size()을 사용하면 문자열의 길이가 반환됩니다.

1

는 콘텐츠의 크기

theFileName.size() 

동안 sizeof 복귀 오브젝트 std::string의 크기로 결정된다. 예를 들어, 객체는 내용의 위치에 대한 포인터와 길이를 나타내는 부호없는 정수를 포함 할 수 있습니다. 따라서 sizeof은 하나의 포인터와 부호없는 정수의 크기를 포함합니다. 콘텐츠를 변경하면 변경되지 않습니다.

2

sizeof은 데이터 구조와 모든 구성원 데이터의 크기를 알려줍니다. 그러나 문자열 객체는 일반적으로 문자열 데이터를 힙에 저장합니다. 즉, 멤버 데이터가 아니지만 객체가 그것을 소유하고 포인터를 저장합니다.

문자열 개체의 크기를 가져 오는 올바른 방법은 size() 또는 length() 멤버 함수를 호출하는 것입니다.

0

sizeof은 바이트 단위로 측정 된 모든 데이터 유형의 크기를 계산하는 데 사용됩니다.

프로그램에서 사용해야하는 기능은 size입니다.

관련 문제