약간의 배경 지식을 위해 독점적 인 DOS 버전을 실행하는 소형 16 비트 휴대용 컴퓨터의 경우 미터 판독 응용 프로그램을 C로 작성합니다.C의 포인터 문제 - 내가 뭘 잘못 했니?
나는 계량기 정보를 표시하는 화면을 가지고 있으며 사용자가 입력을 요구합니다. 사용자는 장치의 Enter 키를 누르면, 다음 코드를 실행한다 :
/* ...
* beginning of switch block to check for keystrokes
* ...
*/
case KEY_ENTER: {
/* show what has been entered */
if(needNew == 0) {
/* calculate usage for new reading */
double usg = 0;
int ret = CalculateNewUsage(vlr, buf, &usg);
VerifyReadScreen(vlr, ret, buf, &usg);
needRedraw = TRUE;
}
break;
}
/* .... end switch statement */
vlr
모든 계정/계량 정보를 보유 구조체에 대한 포인터, buf
을위한 숫자 키를 저장하는 데 사용되는 유형 char[21]
이며 이 블록 위에 처리되는 판독 값. CalculateNewUsage
을 호출하기 전과 후에 모두 내 변수에 유효한 데이터가 들어 있습니다.
그러나 VerifyReadScreen
을 입력 한 후 변수 데이터를 다시 검사하면 newread
이 메모리에서 임의의 위치를 가리키고 있으며 저작권 고지문이 표시됩니다. 흥미로운 것은 아무런 계정이나 내가 입력 한 내용에 상관없이 newread
의 잘못된 데이터가 화면에 VerifyReadScreen
에 인쇄되어 있습니다. 나는 CalculateNewUsage
과 같은 방식으로 주소를 VerifyReadScreen
으로 전달하고 있지만 어쨌든 나는 다른 무엇인가로 끝났습니다. 여기
는 VerifyReadScreen
입니다 :
printf("%s", newread); /* yay! */
것은 내가 필요로하지 않았기 때문에 :
BYTE VerifyReadScreen(const VLRREC * vlr,
const int status,
const char * newread,
const double * usage) {
/* snip a whole bunch of irrelevant formatting code */
printf("%s", (*newread)); /* prints funky copyright text */
/* snip more irrelevant formatting code */
return TRUE;
}
가 실제로
VerifyReadScreen
에
newread
를 인쇄하고 코드가 정말 읽어야한다는 지적에 대해 Jefromi에게 감사
printf
이 나를 대신하기 때문에
newread
을 참조 해제하십시오. 필자는 본질적으로 메모리의 임의의 장소 인 포인터에 포인터를 전달하고있었습니다.
어떻게'buf'와'usg'가 선언 되었습니까? –
"buf가 문자열"이라고 할 때, 이미'char *'를 의미합니까? 그리고 당신은 그것의 주소를'const char *'라고 타이핑하고 있습니까? – Cascabel
@Alokzilla - buf는 키 스트로크를 검사하는 코드의 함수 블록 내에 선언 된'char [21]'유형입니다. usg는'case KEY_ENTER' 블록 내에서 선언됩니다. –