2014-11-16 4 views
2

다음 구문은 C++ 표준에 따라 유효하며이 구문 뒤에 arr은 어떻게해야합니까?크기를 지정하지 않고 배열을 할당하십시오.

char* arr = new char[]; 

미리 감사드립니다.

+0

그것은 모든 기준에서 유효합니다. 의미론은 무엇입니까? – didierc

+1

나는 유효한 *을 * 만들 수있는 예외가 사용자 정의 된 배치가 될 것이라고 생각한다. 여기서 사용자 정의 된 args는 비어있다. 하지만이 경우 주소를 전달해야합니다. –

+2

나는 당신이 찾고 있을지도 모른다 생각한다 ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector) – sjdowling

답변

5

아니요. 허용되지 않습니다./1 expr.new]의 새로운 표현들에 대한 문법

noptr 새로운-선언자 지정
        []특성 지정자-SEQ opt
          noptr-new-decla rator속성 지정자-SEQ 옵트 [상수 표현]은

은 분명히 코드에서 괄호 사이에 표현이 없습니다. 그리고 그것은 의미가 없습니다. 어떻게 알 수없는 길이의 배열을 할당 할 수 있습니까?

동적으로 크기를 변경할 배열이 필요한 경우 std::vector을 사용하십시오.

+0

'표현식 '은 어떻게 정의되어 있습니까? –

+0

@BartekBanachewicz 그것은 '진술'이 아닌 모든 것입니다. 그게별로 도움이되지 않습니다 : http://stackoverflow.com/questions/3846727/why-is-the-difference-between-an-expression-and-a-statement – druckermanly

1

C++ 컴파일러는 크기가 0 인 배열을 선언 할 수있는 확장을 정의합니다. 일반적으로 구조의 마지막 필드를 선언 할 때 유용하므로 구조 할당 중에 해당 배열의 길이를 선택할 수 있습니다. 당신은하자가 편곡 말과 7 개 요소를 가지고 이러한 할당을 좋아하는 경우에

struct A 
{ 
    float something; 
    char arr[]; 
}; 

그래서, 당신이 할 : 당신은이를 sizeof (A)을주의해야한다

A* p = (A*)malloc(sizeof(A) + sizeof(char)*7) ; 

이를 sizeof 같음 (플로트) 따라서 컴파일러의 arr 필드는 0입니다.

이제 7 개 인덱스에 도착 필드를 사용할 수 있습니다

p->arr[3]='d'; 
+0

실제로이 기능은 일부 구현에 존재하지만,이 'new'를 사용하는 배열의 동적 할당이 아닙니다. – didierc

관련 문제