char *s;
(대부분의 시스템에서 32/64 비트) 메모리 어드레스를 유지하기 위해 필요한 바이트의 수를 할당. 그러나 포인터를 초기화하지 않으므로 포인터의 값 (주소는)은 정의되지 않습니다.
Ergo : fscanf가 정의되지 않은 메모리 주소에 쓰려고합니다.
char * s = NULL로 초기화했습니다.
예, 이제 포인터가 초기화되었지만 이제 아무데도 가리키고 있습니다.
Ergo : fscanf는 아무 것도 쓰지 않으려 고 시도합니다.
해결책은 fscanf가 사용할 수있는 메모리를 할당하는 것입니다. fscanf가 마법을 사용하여 메모리를 할당하지 않습니다!
스택 메모리 또는 동적 할당 메모리 (힙)를 사용할 수 있습니다.
스택 메모리는 관리하기가 쉽지만 힙보다 훨씬 작습니다. 여기
스택에 메모리를 사용하는 솔루션 : 내가 대신 %s
의 %9s
을 사용하는 이유 당신은
// Allocates 10 bytes on the stack
// Given 1 Character = 1 Byte the
// buffer can hold up to 9 characters.
char myBuffer[10];
// Initialize s with the address of myBuffer
char *s = myBuffer;
// Call fscanf
fscanf(stream, "%9s", s);
궁금 할 수있다.
이유는 버퍼 오버 플로우 방지하는 것입니다
fscanf 버퍼가 얼마나 큰지 알고하지 않습니다, 그래서 당신은 그것을 알 필요가있다.
그렇지 않으면 fscanf는 할당 된 메모리 이외의 데이터를 씁니다.
일반적으로 C 문자열 및 메모리 관리에 대해 읽어 보시기 바랍니다.
출처
2017-04-24 01:44:51
d3L
1.'fopen' 결과를 확인하지 않습니다. 2.'s'는 초기화되지 않은 포인터입니다. 데이터는 어디로 이동합니까? – John3136
'char s [16]; fscanf (stream, "% s", &s);' – BLUEPIXY
GCC를 사용한다면, 항상'gcc -Wall -Werror'로 컴파일하십시오. –