2017-11-12 8 views
20

이 선언은 매우 혼란?혼란 선언과 초기화

new char[1024]{}은 각각 0의 값을 갖는 1024 요소의 char 배열을 초기화한다고 생각합니다.

char* q = [0,0,....] // until 1024 

올바른 :

그래서이 동일하다?

+0

'char * q'는'char'에 대한 포인터입니다. – melpomene

답변

22

q 같은지 char 포인터이다

char* q = new char[1024]{}; 

같다. 즉, 형식은 char *입니다.

char의 배열을 동적으로 할당하고 0으로 초기화하는 식 new char[1024]{}을 사용하여 초기화됩니다. 이것이 실패하면 예외가 발생합니다.

q은 동적으로 할당 된 배열의 첫 번째 char을 가리 킵니다. 배열이 아닙니다.

그것은

숯의 Q * = [0,0, ....] //와 동일하지

즉 잘못된 구문 때문에 1,024까지. q 포인터이며, 값들의 세트로 초기화 될 수 없기 때문에 또한

char* q = {0,0,....}; // 1024 zeros in initialiser 

동등하지 않다. 그것은 문자가 아니라 처음 초기화되지 않은 다음 물론 제로 (그리고, 덮어 쓰기 것보다, 제로로 초기화하는 것을 제외하고

char *q = new char[1024];  // dynamically allocates chars uninitialised here 
std::fill(q, q + 1024, '\0'); 

에 (순) 효과 가까운, 그것은 초기화합니다 어떻게 컴파일러에 달려있다 문자).

+0

감사합니다. 훌륭한 설명! 나는 이제'p'가 단순히 첫 번째 요소의 주소를 가리킨다는 것을 이해합니다. ** 1024 **'8 비트 조각 메모리 '(정확한 용어가 확실하지 않음)가 힙에 예약되어 있고'0 '으로 초기화되었다고 말하는 것이 맞습니까? –

+3

@SamHammamy "적어도 1024 개의 주소 지정 가능한 메모리 단위 크기의 메모리가 new 연산자로 할당되었습니다"라는 (지나치게) 올바른 표현이됩니다. '적어도'컴파일러는 배열을위한 더 많은 메모리를 할당 할 수 있기 때문에, '주소 지정 가능한 메모리 유닛'은 char이 가장 ​​작은 주소 지정 가능한 메모리 유닛을 정의하고 비트 단위로 카운팅하는 것이 보조이기 때문입니다. 'operator new'는 힙이 표준에 의해 인식되지 않기 때문입니다. 정상적인 기계에서 이것은 비록 당신이 말한 것과 같을지라도 – WorldSEnder

+1

@SamHammamy - 나는 그것이 정확하다고 말하지 않을 것입니다.'new' 표현식은'1024' (더 엄격하게'char'의 크기의 1024 배) 크기의 메모리를 동적으로 할당하지만, 표준은'sizeof (char)'를'1'로 정의합니다. WorldSEnder가 지적했듯이, 구현은 더 많은 것을 할당 할 수 있습니다 (예 : 시스템 종속적 인 "블록 크기"의 배수로 올림). 그러나 프로그램이이를 존중할 수는 없습니다. "힙"은 일부 (구형) 시스템의 메모리 관리에 대한 구현 세부 사항이며 표준이 요구하는 것 또는 다른 시스템이 수행하는 것을 반영하지 않습니다. 마지막으로 'char'는 8 비트 이상일 수 있습니다. – Peter

28
char* q {new char[1024]{}}; 

차례로

char* q = new char[1024] { 0, 0, 0, 0 /* 1020 more zeros */ }