왜 scanf를 사용하여 문자열 버퍼를 읽으면 앰퍼샌드(&)가 있는 경우와 없는 경우 모두 동작합니까?
좀 헷갈리는 게 있어요.C 스트링을 읽는 올바른 방법은scanf()…과 같은 방향으로 가다
(버퍼 오버플로우 가능성은 신경 쓰지 마세요.이것은 단순한 예에 불과합니다).
char string[256];
scanf( "%s" , string );
하지만 다음 사항도 효과가 있는 것 같습니다.
scanf( "%s" , &string );
이것은 단지 나의 컴파일러(gcc)인가, 순전히 행운인가, 아니면 다른 것인가?
어레이는 첫 번째 요소에 대한 포인터로 "감쇠"하기 때문에scanf("%s", string)와 동등하다scanf("%s", &string[0])반면에scanf("%s", &string)포인터를 건네주다char[256]같은 장소를 가리키고 있습니다.
그리고나서scanf인수목록의 꼬리를 처리할 때,는 다음 명령어를 추출하려고 합니다.char *네가 합격했을 때 그게 옳은 일이야string또는&string[0]하지만 당신이 합격했을 때&string당신은 언어 표준이 보장하지 않는 무언가에 의존하고 있습니다. 즉, 포인터가&string그리고.&string[0]-- 같은 장소에서 시작하는 다른 유형 및 크기의 오브젝트에 대한 포인터는 동일한 방식으로 표시됩니다.
나는 그것이 작동하지 않는 시스템을 만나본 적이 없다고 믿는다. 그리고 실제로 당신은 아마 안전할 것이다.그러나 이는 잘못된 것이며 일부 플랫폼에서는 장애가 발생할 수 있습니다.(가상적인 예: 모든 포인터에 유형 정보를 포함하는 "디버깅" 구현입니다.심볼릭스의 "Lisp Machines"의 C 실장에서는 이와 같은 작업이 이루어졌다고 생각합니다.)
아래 내용이 정확하고 도움이 될 것 같습니다.오류가 발견되면 언제든지 수정해 주세요.C는 처음입니다.
char str[]
- 메모리 내의 주소를 가진 char 타입의 값 배열
- 배열 내의 요소 수만큼 연속된 주소의 메모리 내 주소를 가진 char형 값의 배열
종료 늘 문자 포함
'\0'&str,&str[0]그리고.str3개 모두 메모리 내에서 어레이의 첫 번째 요소의 주소인 같은 위치를 나타냅니다.strchar *strPtr = &str[0]; //설정 및 초기화
또는, 이것을 2개로 분할할 수 있습니다.
char *strPtr; strPtr = &str[0];
strPtr에 대한 포인터입니다.charstrPtr배열 중인 점strstrPtr메모리 내에 자체 주소를 가진 변수입니다.strPtr주소 값을 저장하는 변수입니다.&str[0]strPtr메모리내의 자기 주소가, 보존되고 있는 메모리 주소와 다르다(메모리내의 어레이 주소 a.k.a & str[ 0 ]&strPtrstrPtr 자체의 주소를 나타냅니다.
포인터에 대한 포인터를 다음과 같이 선언할 수 있습니다.
char **vPtr = &strPtr;
strPtr 포인터의 주소로 선언 및 초기화한다.
또는 다음 두 가지로 분할할 수 있습니다.
char **vPtr;
*vPtr = &strPtr
*vPtrstrPtr 포인터의 포인트*vPtr메모리 내에 자체 주소를 가진 변수입니다.*vPtraddress &strPtr 값을 저장하는 변수입니다.- 최종 코멘트: 할 수 없습니다.
str++,straddress는 a입니다.const할 수 있습니다.strPtr++
언급URL : https://stackoverflow.com/questions/5406935/why-does-reading-into-a-string-buffer-with-scanf-work-both-with-and-without-the
'programing' 카테고리의 다른 글
| 지시문에 데이터를 전달하시겠습니까? (0) | 2022.08.28 |
|---|---|
| 컴파일러는 다른 유형의 루프에 비해 do-while 루프에 대해 더 나은 코드를 생성합니까? (0) | 2022.08.28 |
| IntelliJ IDEA에서 Eclipse의 Ctrl+O(개요 표시) 단축키는 무엇입니까? (0) | 2022.08.28 |
| vuex 스토어 데이터를 리셋/삭제하려면 어떻게 해야 합니까? (0) | 2022.08.27 |
| Vue 2의 컴포넌트 어레이에서 아이템을 추가 및 삭제하는 방법 (0) | 2022.08.27 |