2011-10-20 4 views
10

이것은 다른 question의 연속입니다.문자열 배열 초기화

는 다음과 같은 코드를 생각해

char *hi = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

그것은 놀랍게도 컴파일되지 않습니다 (분명히 나뿐만 아니라 내가 생각으로 C 구문을 모르는)을 다음과 같은 오류 발생 :

error: initializer element is not constant 
을 나는 문자로 문자 *를 변경하는 경우

[]는 그것을 잘 컴파일 :

char hi[] = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

누군가 내게 이유를 설명 할 수 있습니까?

답변

6

첫 번째 예제 (char *hi = "hello";)에서는 정적 const 문자열 "hello"를 가리 키도록 초기화되는 비 const 포인터를 만듭니다. 이 포인터는 이론적으로 당신이 좋아하는 것을 가리킬 수 있습니다.

두 번째 예 (char hi[] = "hello";)는 포인터가 아닌 배열을 구체적으로 정의하므로 참조하는 주소는 수정할 수 없습니다. 배열은 특정 메모리 블록에 대한 수정 불가능한 포인터로 간주 될 수 있습니다.

첫 번째 예제는 실제로 C++ (제 컴파일러, 적어도)에서 문제없이 컴파일됩니다.

+1

감사합니다. 코드의 첫 번째 부분을 만들기 위해 const 키워드를 사용하는 방법이 있습니까? – lang2

+1

@ lang2 해당 범위에 포함되지 않습니다. 이 [C FAQ] (http://c-faq.com/ansi/constasconst.html)를 참조하십시오. 'char * const hi' (char에 대한 상수 포인터)조차도 아닙니다. – cnicutar

+0

그냥 뭔가 추가, 그게 작동하지 않을지 모르겠다. 첫 번째 버전은 C++에서 OK를 컴파일한다. - 잠시 후에 C 컴파일러를 사용해 보자. – icabod