2014-10-01 5 views
3
char *c[] = { "str1", "str2", "str3", "str4" }; 
char **c = { "str1", "str2", "str3", "str4" }; 

첫 번째 줄이 유효합니다. 두 번째는 그렇지 않습니다. 왜?char **를 사용하여 C에서 문자열 배열로 char **를 초기화

+0

그들이 다른 두 가지가 있으며, 배열 char * pointer와 char * pointer에 대한 char * pointer - 같은 것이 아님 –

+1

문자열 리터럴을'char *'에 할당 할 때 자신에게 유리한 점을 주며 저장 클래스'const char *'를 지정하십시오. . 여기에있는 'const' 비트 –

+0

문자열 리터럴에 대한 일반 비 const 포인터를 갖는 것은 결코 의미가 없습니다. const에 대한 포인터 여야합니다. – Lundin

답변

5

번째 행은 어레이 초기화 구문

+0

이 정의되지 않은 동작입니까? – 4pie0

+0

@ 0d0a : 컴파일하지 않으면 정의되지 않은 동작이 될 수 없습니다! –

+0

@PaulR 확실하지만 [컴파일은] (http://ideone.com/0DNMqm) – 4pie0

3

첫 줄 char*의 어레이를 초기화하는 기본 구문을 사용할 수 있도록 배열이 아니다.

두 번째 줄은 단순히 형식 오류입니다. http://coliru.stacked-crooked.com/a/53464db7e2f31cfa

당신은 화합물 문자하지만 (C99)로 저장할 수 있습니다 :

는 coliru에 살고 참조

char **c = (char*[]){ "str1", "str2", "str3", "str4" }; 

이 일정하지 않은 화합물 문자 자동 저장에 있음을주의 함수에 정의 된 경우. 당신이 이렇게 할, 그것은 (혼동 유형 char[]이있는) 문자열과 같은 상수 리터럴 (따라서 정적 스토리지)하고 싶다면

:

char **c = (char**)&*(const char* const []){ "str1", "str2", "str3", "str4" }; 
+0

이것은 올바르지 않습니다. 질문에 태그가 붙어 있습니다. C – 4pie0

+0

@ 0d0a : 올바르지 않은 것은 무엇입니까? – Deduplicator

+0

"구문 오류", http://ideone.com/0DNMqm – 4pie0

관련 문제