2014-03-13 5 views
1
char ch[3]; 
strcpy(ch,"Hello"); 
cout<<ch<<" "<<sizeof(ch); 

Q1. 왜 Ch의 크기가 3 일 때 "Hello"를 인쇄하나요?C++ 문자열에서 문자열로 변환

2. ch가 ch [2]에서 ch [6] (암시 적 타입 변환에 의해)로 변환되면 sizeof (ch)가 여전히 3 인 이유는 무엇입니까?

+0

채널이란 무엇입니까? 나는 오직'char a [3]'만을 보았습니다. – taocp

+0

A1 : Undefined Behavior; A2 : 형식이 전혀 변환되지 않습니다. – 0x499602D2

+0

코드에 실수가있는 것 같습니다. char a [3]을 사용하고 "a"대신 "ch"에 복사합니다. – RacerNerd

답변

3

strcpy는 크기 검사를하지 않으므로 a의 메모리 주소에 "Hello \ 0"을 씁니다. 메모리에있는 것보다 우선적으로 덮어 씁니다.

변환이 수행되지 않습니다. ch는 strcpy 이전의 char [3]입니다.

3

char a[3];을 입력했을 때 나는 char ch[3];을 의미한다고 가정합니다.

A1 : 어떤 크기의 배열을 선언 할 때 최대 값은 입니다. 이 경우처럼 초과하면 결과가 정의되지 않습니다.

A2 : 이와 같이 변환 할 수 없으므로 문제가되지 않습니다.

3

정말 위험한 일을하고 계십니다. 이것은 std::string을 사용하는 이유 중 하나입니다. 간단한 복사를 위해 범위를 벗어나지 않았는지 확인하지 않아도됩니다.

질문 1 : 다른 사람처럼
그것은 정의되지 않은 동작과 일어날 수있는 일이다 "안녕"을 인쇄, 이미 말했다. 그러나 그것이 전부는 아닙니다. 코드 에서처럼 경계를 작성하는 것은 위험합니다. Buffer Overflow이 기본적으로 있습니다. 위키피디아의 예제를 보면 거의 동일한 코드임을 알 수 있습니다.

질문 2 :
변환이 없습니다. 배열 chdecays into a pointerstrcpy(ch, "Hello");를 호출 할 때. strcpy에는 포인터가 메모리 주소 이상이기 때문에 안전하게 복사 할 수있는 문자 수를 알 수있는 방법이 없습니다. 그것은 얼마나 많은 메모리가 그 위치에서 사용 가능한지를 알지 못하며 그래서 당신이 범위를 벗어나더라도 모든 것을 씁니다.

코드에있는 것과 같은 것들이 포인터가 안전하지 않은 이유 중 하나입니다.

관련 문제