2012-05-29 3 views
0

new[] 연산자를 사용하는 동안 문제가 발생하고 creatin은 char에 대한 포인터 배열을 사용합니다. char* 때문에 내가 요소 내가 그것을 둘러싸는 괄호를 사용되기를 원한다면 유형이지만, 그것은 작동하지 않습니다연산자의 구문 new []가 포인터 배열을 생성하는 중

char **p = new (char *)[vector.size()]; 

을하지만 괄호를 제거 할 때 작동 :

char **p = new char *[vector.size()]; 

후자는 왜 작동합니까?

+14

왜 그래야할까요?! 유형과 관련된 괄호는 사용할 수 없습니다. '(int) x = 2; '가 잘못되었습니다. 'char * p = 0;'이 올바르게,'(char *) p = 0;'이 포인터 타입에 대해서도 마찬가지이다. –

+0

왜냐하면 나는이 int i를 좋아해야한다고 생각하기 때문에; char * p = (char *) i; – iverson

+1

@FerdinandBeyer와 동의하십시오. "int a"는 "int a"와 같은 의미입니까? –

답변

1

이것은 "declaration follows use"의 결과입니다. char **p;은 "p를 두 번 역 참조하면 char"이됩니다. (char*) *p은 왼쪽에 형식이 없으며 "dereference p"을 의미하는 구문으로 파싱되어 char에 대한 포인터로 결과를 캐스팅합니다.

char **이 형식 이름으로 사용되면 유사한 규칙이 적용됩니다. (char*) *은 유형 이름으로 해석하지 않고 표현식으로 사용합니다 (왼쪽에 유형이 없으므로).

+0

아마도 "역 참조 (dereference)'p'를 작성하고 결과를'char'에 대한 포인터로 캐스팅하려고했을 것입니다. :) – LihO

+0

@LihO : 물론. 감사. 앞으로도 이러한 오타 수정은 자유롭게하십시오 (; – Mankarse

2

char *p = new char[10]; 동적 10 개 문자의 크기 배열하는 메모리 블록을 할당하고 p에 저장된 첫 번째 요소의 주소 (이 메모리 블록의 선두를 가리 키도록 p 제조)를 반환한다. 이 경우

이는 new 키워드가 배열 형식 지정자 뒤에, 당신은 유형을 지정
char **p = new char*[10]; -이 경우에는 유형 char*하지 (char*)입니다. operator new[]

당신은 아마 때문에 C 스타일의 다른 유형으로 변환 할 수있다 반환 값의 유형은 항상 void*입니다 malloc 구문을 혼란 그래서 당신은 역 참조 할 수 있는지 확인합니다. 즉, 당신이 (char*) 구문 (C-스타일 유형 캐스트)를 사용하는 상황입니다 : char *p = (char*) malloc(10);
하지만 참고 C이 캐스트가 중복입니다 : Do I cast the result of malloc?

new[]을 사용하여 할당 된 메모리가 delete[]를 호출하여 해제해야하고 malloc에 의해 할당 된 메모리는 free에 의해 해제되어야합니다.