소개
게시글
질문&답변
2024.05.09
포인터 초기화 질문
안녕하세요? 질문&답변 도우미 Soobak 입니다. 포인터 변수를 특정 주소값으로 초기화하는 것은 기술적으로 가능하지만, 실제 응용 프로그램에서는 권장되지 않습니다. (특정 분야 제외) 예시 ) int *p = (int *)0x10000000; // 특정 주소를 가리키는 포인터를 초기화 if (p != NULL) printf("%d", *p); // 그 주소에 저장된 값을 출력 또한, 해당 메모리 주소가 유효한 메모리 주소인지, 혹은 해당 메모리 영역에 접근할 권한이 있는지 등은 프로그램의 실행 환경에 따라서 달라지게 됩니다. 이에 대해서는, 0x00000000 과 같은 형식의 메모리 주소는 '가상 메모리' 이며, 이를 실제 메모리 주소(물리 메모리 주소)와 매핑하고 관리하는 것은 운영체제가 담당한다는 점, 따라서 위와 같은 접근은 예기치 못한 행동이나 오류가 발생할 수도 있다는 점 또한 알아두시면 학습에 도움이 되실 것 같습니다. 때문에, 대부분의 응용 프로그램에서는 포인터를 특정 메모리 주소로 초기화할 이유가 없고, 대신, malloc() , calloc() 과 같은 메모리 할당 함수를 사용하여 동적으로 메모리를 할당하고, 이 주소를 포인터에 저장하여 사용합니다. 메모리와 관련된 내용은 강의 12.1 메모리 레이아웃 훑어보기 에서 보다 자세하게 학습하시게 되며, 공부에 재미가 생기셨을 때 섹션 0 의 강의들을 잠시 복습해보셔도 도움이 많이 되실 것 같습니다.
- 1
- 1
- 28
질문&답변
2024.05.09
디버깅이 강사님 처럼 나오지가 않아요..
안녕하세요? 질문&답변 도우미 Soobak 입니다. 질문자님께서 말씀하시는 '깔끔하게 나오지 않는다' 가 어떤 의미인지 제가 잘 이해하지 못하였습니다. 조금 더 구체적으로 말씀해주시면 명확한 답변을 드릴 수 있을 것 같습니다. 첨부해주신 3장의 이미지 중, 첫 번째 사진이 질문자님의 화면 사진, 두 번째와 세 번째 사진은 강의 화면인 것으로 생각되어, '디버깅 중인 변수에 대한 정보', '메모리 주소' 에 대한 인터페이스를 어떻게 나타나도록 하는지를 궁금해하시는 것으로 생각하고 답변을 드려봅니다. 강의 화면 아래에 나타나는 변수의 이름과 값, 자료형이 나타나는 창은 디버깅을 위한 중단점을 찍으신 후, 상단의 메뉴바에서 Debug 메뉴를 누르신 후, Window 카테고리에서 Local 을, 메모리 주소가 나타나는 창은 Debug > Window > Memory 를 눌러보세요. 혹시나 원하시는 답변이 아니시라면, 궁금해하시는 부분에 대하여 조금 더 구체적으로, 편하게 댓글 남겨주세요.
- 1
- 1
- 20
질문&답변
2024.05.09
출력이 이상한데 이유를 모르겠어요
안녕하세요? 질문&답변 도우미 Soobak 입니다. 코드를 살펴보니, 마지막 while() 반복문 부분에 오타가 발생하셨네요. head 문자열에는 '\n' 문자가 없으므로, 반복문이 종료되지 못하고 계속 실행되다가 잘못된 메모리 접근을 하게 되어 이상한 문자들이 출력되는 것입니다. (예기치 못한 동작) 강의에서의 코드처럼 '\0' 과의 비교로 조건문을 수정해보세요. while (*(head) != '\0') putchar(*(head++));
- 1
- 1
- 20
질문&답변
2024.05.08
코드
안녕하세요? 질문&답변 도우미 Soobak 입니다. 질문자님의 코드가 의도대로 작동하지 않는 가장 큰 문제 중 하나는, 반복문 내에서 getchar() 함수를 반복적으로 호출하고 있기 때문입니다. getchar() 함수는 호출될 때마다 새로운 문자를 입력 스트림에서 읽어옵니다. 따라서, 같은 반복문 안에서 getchar() 을 여러번 호출하면 서로 다른 문자에 대해서 작업을 수행하게 됩니다. 예를 들어, while ((c = getchar()) != STOP) { if (getchar() != ' ') n_chars++; if (getchar() != ' ') n_words++; if (getchar() == '\n') n_lines++; } : 위의 코드의 while() 반복문 내의 3 개의 if() 조건문과 getchar() 함수 부분을 살펴보면, 첫 번째 if (getchar() != ' ') 에서 문자를 읽은 후 공백이 아니면 n_chars 를 증가시킵니다. 두 번째 if (getchar() != ' ') 에서는 새로운 문자 를 읽은 후, 공백이 아니면 n_words 를 증가시킵니다. 세 번째 if (getchar() != '\n') 역시 새로운 문자를 읽은 후, 개행 문자가 아니라면 n_lines 를 증가시킵니다. 따라서, 각 호출에서 다른 문자를 처리하기 때문에 의도한대로 문자, 단어, 줄 수를 세지 못하게 됩니다. bool 자료형 line_flag 와 같은 변수의 주된 목적은 문자가 나타날 때마다 줄 수를 여러 번 세지 않도록 하는 것입니다. line_flag 는 초기에 false 로 설정됩니다. 문자가 공백이 아닌 경우( !isspace(c) ) 처럼 처음 문자가 나타나면 line_flag 가 false 에서 true 로 바뀌고 줄 수가 1 증가합니다. c == '\n' 조건을 만족하면, line_flag 는 다시 false 로 설정됩니다. 즉, line_flag 는 한 줄에 처음 나타나는 공백이 아닌 문자에 대해서만 줄 수를 셀 수 있도록 하며, 그 다음 줄바꿈 문자가 나타날 때까지는 줄 수를 증가시키지 않습니다. 이러한 flag 의 사용에 대해서는 적극적으로 디버깅을 해보시면서 과정 전체를 한 번 눈으로 확인해보시는 과정을 거쳐보시는 것을 권장드려봅니다.
- 1
- 1
- 29
질문&답변
2024.05.07
디버깅 중 루프탈출
안녕하세요? 질문&답변 도우미 Soobak 입니다. 저 같은 경우에는, F9 단축키를 이용해서 반복문 바로 바깥에 새로운 중단점을 찍고 F5 단축키로 이어서 실행합니다. 혹은, 위 과정을 원하는 지점에 마우스 커서를 위치시키고(반복문 바깥 지점) Ctrl + F10 단축키로 커서의 위치까지 디버깅을 실행하고 멈추도록 합니다.
- 1
- 1
- 50