2014-06-08 3 views
0

왜이 두 배열 초기화간에 차이가 있습니까?C : 두 배열 초기화 간의 차이점

char *message = "HELLO"; 

if(message[0] == 'H'){ 
    // true 
} 

좋아요. 하지만 그렇지 않습니다.

char message[6] = "HELLO"; 

if(message[0] == 'H'){ 
    // false 
} 

같은 것을 표현하지 않습니까?

+0

그들입니다. gcc 4.8.2에서 예상되는 동작을 얻고 있습니다. –

+0

둘 다 내 사실이 –

+2

아마 잘못된 예를 들었을 것 같습니다. 그것들 모두는 (if ("HELLO"[0] == 'H')')뿐만 아니라 true로 평가되어야한다. –

답변

0

를 채우는 데 strcpy를 사용해야합니다. 포인터를 수정할 수 있습니다 (예 : ++message). 포인터가 가리키는 내용을 수정할 수 없습니다 (message[0] = 'X'은 정의되지 않은 동작을 호출 함).

두 번째 코드 단편에서 message은 이니셜 라이저가있는 문자 배열입니다. 변수 (++message은 유효하지 않음)를 수정할 수는 없지만 어레이 내용을 수정할 수 있습니다 (message[0] = 'X'은 유효합니다).

또한 sizeof(message)은 다를 수 있습니다.

message[0]에 액세스 할 때도 마찬가지입니다. 즉, 주장한 행동에 대해 잘못된 것이거나 컴파일러에 매우 놀라운 버그가 있습니다.

하지만 그들은 여러 가지 방식으로 다르게 행동하며 그 중 일부는 내가 방금 열거 한 것 중 일부입니다.

0

"HELLO"const char *입니다. 그러나 역사적인 이유로 인해 이것은 char *로 간주 될 수 있습니다.

char messagd[6]은 스택에있는 문자의 배열입니다. 다른 짐승.

당신은 message 문자의 읽기 전용 배열에 대한 포인터, 첫 번째 코드 조각에 해당 배열을