programing

왜 scanf를 사용하여 문자열 버퍼를 읽으면 앰퍼샌드(&)가 있는 경우와 없는 경우 모두 동작합니까?

prostudy 2022. 8. 28. 11:50
반응형

왜 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[]  
  1. 메모리 내의 주소를 가진 char 타입의 값 배열
  2. 배열 내의 요소 수만큼 연속된 주소의 메모리 내 주소를 가진 char형 값의 배열
  3. 종료 늘 문자 포함'\0' &str,&str[0]그리고.str3개 모두 메모리 내에서 어레이의 첫 번째 요소의 주소인 같은 위치를 나타냅니다.str

    char *strPtr = &str[0]; //설정 및 초기화

또는, 이것을 2개로 분할할 수 있습니다.

char *strPtr; strPtr = &str[0];
  1. strPtr에 대한 포인터입니다.char
  2. strPtr배열 중인 점str
  3. strPtr메모리 내에 자체 주소를 가진 변수입니다.
  4. strPtr주소 값을 저장하는 변수입니다.&str[0]
  5. strPtr메모리내의 자기 주소가, 보존되고 있는 메모리 주소와 다르다(메모리내의 어레이 주소 a.k.a & str[ 0 ]
  6. &strPtrstrPtr 자체의 주소를 나타냅니다.

포인터에 대한 포인터를 다음과 같이 선언할 수 있습니다.

char **vPtr = &strPtr;  

strPtr 포인터의 주소로 선언 및 초기화한다.

또는 다음 두 가지로 분할할 수 있습니다.

char **vPtr;
*vPtr = &strPtr
  1. *vPtrstrPtr 포인터의 포인트
  2. *vPtr메모리 내에 자체 주소를 가진 변수입니다.
  3. *vPtraddress &strPtr 값을 저장하는 변수입니다.
  4. 최종 코멘트: 할 수 없습니다.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

반응형