우리

2014-12-22 3 views
-3

우리는 크기를 할당하는 경우 = 새 문자 [3] i가 가질 ptr.since이 광고 숯 *의 PTR의 의미가 무엇인지에 대한 포인터우리

#include<iostream> 
#include<cstring> 
using namespace std; 
int main() 
{ 
char (*ptr)=new char[3]; 
strcpy(ptr,"ert"); 
cout<<ptr<<endl; 
return 0; 
} 

의 크기를 선언 할 수 포인터 크기를 선언 할 크기를 3으로 지정하고 문자열을 "ert"로 지정하면 문자열 길이가 너무 길기 때문에 오류가 발생하지만 포인터는 크기를 할당 할 수 없습니다. nul terminator에 대한

char *ptr=new char[4]; 
strcpy(ptr,"ert"); 

한 여분의 공간 :

+0

''ert "'는 실제로 4'char' 's를 보유합니다. 끝에 추가로 nul이 있습니다. –

+0

당신이 할 수있는 최선의 방법은'strncpy'와 같은 것을 사용하는 것입니다. – PeterT

+0

런타임에 할당 한 바이트 수를 모르기 때문에 에러를 표시 할 필요가 없습니다. – thang

답변

1

당신은 4 문자를 필요

|e|r|t|\0| 
0

이 문 3와 힙 익명의 문자 배열의 첫 번째 할당에서

char (*ptr)=new char[3]; 

배열의 첫 번째 요소의 주소가 할당됩니다. 포인터 ptr에 ed. 위의 문 또는 다음과 같은 방법으로 초기화 여부를

포인터의 크기는 변경되지 않습니다 sizeof(ptr)은 일반적으로 중 4 또는 8 바이트에 따라 동일하고 동등한 것입니다

char (*ptr)=new char; 

프로그램이 컴파일 될 환경에서

C++은 배열의 경계를 확인하지 않습니다. 이 문장

strcpy(ptr,"ert"); 

에서이 프로그램의 동작을 정의되지 않은 그래서 "ert" 리터럴 문자열이 종료 제로 등 4 개 요소를 가지고 있기 때문이다.

0

여러분이 선언 한 포인터의 크기가 아니라 포인터가 가리키는 문자 배열의 크기입니다.

strcpy()은 포인터가 가리키는 배열의 길이를 알지 못합니다. 단지 복사 할 수있는 첫 번째 바이트에 대한 포인터를 가지고 있으며 사본을 만들 충분한 공간이 있다는 것을 신뢰합니다. 따라서 속도는 매우 빠르지 만 위험하기 때문에 목적지가 충분히 클 때만 사용해야합니다.

strncpy()은 추가 안전성을 고려해야하지만 대상 포인터가 지정한 크기만큼 충분히 큰 점을 알아야합니다 (대상의 크기보다 소스 크기에 대해 더 많은 것을 보호합니다).

여기서 배우는 교훈은 C 및 C++에서 도움이되지 않는다는 것입니다. 컴파일러는 버퍼 크기를 올바르게 신뢰할 수 있으며 컴파일 또는 런타임시 사용자를 대신하여 검사를 수행하지 않습니다. 이것은 프로그램이 매우 빨리 (런타임 검사없이) 실행될 수있게 해주지 만, 프로그래머는 훨씬 더 조심해야합니다. 귀하의 태그가 제안하는 C++로 작성하는 경우 일반적인 문자열 처리를 위해 C 스타일 문자열 처리가 필요한 특별한 이유가없는 한 반드시 std::string 클래스를 사용해야합니다. 그런 이유로 때때로 그런 이유가있을 수 있지만,하지 않으면 그렇게하지 마십시오.

+0

컴파일러는 이 오류를 진단 ... 대부분은 귀찮게하지 않습니다. gcc 팀에 가입하여 여기에 진단을 추가하십시오! –

+0

'strncpy'는 여기에서 사용하기에 안전한 함수가 아니며 하나의 버퍼 오버플로를 다른 버퍼 오버플로로 대체합니다. –

+0

실제로'strncpy'는이 상황에서 많은 도움이되지 않습니다. 이런 종류의 일에 희생 당하지 않는 언어로 변하는 것 외에도 많은 것이 없습니다. 그리고 그것이 범위를 벗어난 것 같아요 :) –