올바른 방법은 다음 중 하나입니다 :
scanf("%s", &str1[0]); // Correct
scanf("%s", str1); // Also correct
첫 번째 명시 적으로 정확 - 첫 번째 char
의 주소를 전달하려는. 두 번째는 동등합니다. 함수에 배열을 전달하면 포인터가 자동으로 "쇠퇴"합니다. 컴파일러는 array
과 같은 인수를 &array[0]
으로 변환합니다. 첫 번째 문자의 주소 대신 첫 번째 문자를 전달
scanf("%c",str1[0]); // Incorrect
잘못된 밖으로 평평하다. 컴파일이 실패하거나 프로그램을 실행할 때 충돌이 발생할 가능성이 높습니다. 문자는 주소와 매우 다릅니다.
이러한 구분을 허용 할 수 있다면 잘못되었지만 "편평하지 않은"것은 아닙니다.
&str1
을 전달하는 것은 일반적인 오류입니다. 그 이유는 실제로 미묘합니다. &str[0]
은 문자열의 첫 번째 문자의 주소입니다. &str
은 50 자 전체 배열의 주소입니다. 여기 미묘한 점은 실제로 이것들이 메모리에서 같은 주소가된다는 것입니다. 배열은 첫 번째 문자에서 시작됩니다.
그럼 왜 잘못 되었나요?
답변은 타이핑 중입니다. 문자 포인터 -
값 &str
의&str[0]
과는 동일하지만, 종류가 다르다. 이 유형 불일치는 pedantically 말하기, 오류입니다. 정의되지 않은 동작이 발생합니다.
나는 당신이 생각하는 것을 안다. "좋아, 똑똑한 녀석 -이게 실수라면, 왜 효과가 있니?" 음, C는 재미있는 언어입니다. 그것은 정말로 신뢰하고 있습니다. 과도하게 신뢰하고 있습니다. 절벽에서 뛰어 내리라고 말하면 절벽에서 뛰어 내릴 것입니다. 그것은 당신이 절대적으로 정확하고 분별있는 일을하고 있음을 확인하기 위해 방해가되지 않습니다.
기술적으로 무언가를하도록 요청할 수있는 경우가 많습니다. 컴파일러는 정의되지 않은 동작을 진단하고 방지 할 필요가 없습니다. 효율성이라는 명목으로, 그들이 원하는 어떤 것도 할 수 있습니다 : 충돌, 또는 오류 메시지 인쇄 ... 또는 일반적으로 실제로 작동하는 것처럼 보입니다. 그 중 하나입니다. &str
과 &str[0]
의 값은 동일하며 scanf()
은 varargs 함수이므로 모든 컴파일러가 형식 불일치를 catch하지는 않습니다.
사기는 다음과 같습니다. 컴파일러가 실수 할 때마다 알려주지 마십시오. 혼란 스럽거나 정의되지 않은 동작을 호출하는 경우 잠시 동안 벗어날 수 있습니다. 코드가 작동하는 것처럼 보일 수 있습니다. 하지만 시한 폭탄에 앉아있어. 어느 날 그것은 당신의 얼굴에서 날아 올 것입니다. 당신이 그런 char str1[50]
으로 배열을 선언 할 때
유형에 관한 것만 큼 주소가 아닙니다. 'str1'은 기본적으로 포인터입니다. 'str1 [0]'은'char'입니다. – raina77ow
어레이가 포인터로 감퇴하고 있습니다 (1b에서). 이러한 현상을 검색하는 데 도움이되는 몇 가지 키워드입니다. – Cornstalks
[배열의 주소가 C의 값과 어떻게 다릅니 까?] (http://stackoverflow.com/questions/2528318/how-come-an-arrays-address-is-equal-to-its- value-in-c) – raina77ow