왜이 두 배열 초기화간에 차이가 있습니까?C : 두 배열 초기화 간의 차이점
char *message = "HELLO";
if(message[0] == 'H'){
// true
}
좋아요. 하지만 그렇지 않습니다.
char message[6] = "HELLO";
if(message[0] == 'H'){
// false
}
같은 것을 표현하지 않습니까?
왜이 두 배열 초기화간에 차이가 있습니까?C : 두 배열 초기화 간의 차이점
char *message = "HELLO";
if(message[0] == 'H'){
// true
}
좋아요. 하지만 그렇지 않습니다.
char message[6] = "HELLO";
if(message[0] == 'H'){
// false
}
같은 것을 표현하지 않습니까?
를 채우는 데 strcpy
를 사용해야합니다. 포인터를 수정할 수 있습니다 (예 : ++message
). 포인터가 가리키는 내용을 수정할 수 없습니다 (message[0] = 'X'
은 정의되지 않은 동작을 호출 함).
두 번째 코드 단편에서 message
은 이니셜 라이저가있는 문자 배열입니다. 변수 (++message
은 유효하지 않음)를 수정할 수는 없지만 어레이 내용을 수정할 수 있습니다 (message[0] = 'X'
은 유효합니다).
또한 sizeof(message)
은 다를 수 있습니다.
message[0]
에 액세스 할 때도 마찬가지입니다. 즉, 주장한 행동에 대해 잘못된 것이거나 컴파일러에 매우 놀라운 버그가 있습니다.
하지만 그들은 여러 가지 방식으로 다르게 행동하며 그 중 일부는 내가 방금 열거 한 것 중 일부입니다.
"HELLO"
은 const char *
입니다. 그러나 역사적인 이유로 인해 이것은 char *로 간주 될 수 있습니다.
char messagd[6]
은 스택에있는 문자의 배열입니다. 다른 짐승.
당신은 message
문자의 읽기 전용 배열에 대한 포인터, 첫 번째 코드 조각에 해당 배열을
그들입니다. gcc 4.8.2에서 예상되는 동작을 얻고 있습니다. –
둘 다 내 사실이 –
아마 잘못된 예를 들었을 것 같습니다. 그것들 모두는 (if ("HELLO"[0] == 'H')')뿐만 아니라 true로 평가되어야한다. –