강의 내용을 기반으로 제프리 리처 <Windows via C/C++> 을 읽으며 생긴 질문이 있어서 여쭤봅니다. 5판 번역본 기준 730p 입니다. /DelayLoad:MyDll.dll <- 지연로딩할 dll 을 사용하면 링커에게 "실행 모듈의 임포트 섹션으로부터 MyDll.dll 파일을 제거하여 프로세스를 초기화할 때 해당 DLL 을 암시적으로 로드하지 못하도록 한다. 라고 되어 있습니다. (730페이지 상단) 이후에 지연로드 된 함수가 호출되었을 때 해당 함수를 익스포트하고 있는 DLL 이 존재하지 않으면 __delayLoadHelper2() 는 exception 을 던진다고 나와있습니다. (730페이지 3번째 문단) 궁금한 점은 "임포트 섹션에서 MyDll.dll 제거할 때 해당하는 dll 이 없으면 링크타임이나 로드할 때 에러를 발생시키면 되는데 왜 굳이 런타임에 exception 을 던지는지?" 궁금합니다. 항상 유익한 강의 감사합니다 😄
안녕하세요 널널강사님! 우선 좋은 강의에 감사인사드립니다. 파일 입/출력 관련해서 질문이 있는데요! 파일 입/출력이 수행되는 과정에서 이 '과정'에 조금이라도 관여하는 컴퓨터 요소들(CPU, RAM, Kernel, ...)이 무엇인지가 궁금한데요. 예를 들어, 아래와 같은 예졔 소스코드를 제가 디버그 모드로 실행해보았는데요.(참고로 MacOS에서 clang 컴파일러를 사용) #include <stdio.h> int main(void) { FILE* fp = NULL; fp = fopen("../TEST.txt", "w"); if (fp == NULL) { puts("Error: Failed to open file"); return -1; } fprintf(fp, "Hello"); fclose(fp); return 0; } 어쨌건 위 소스코드가 하는 일은 "TEST.txt" 라는 파일을 생성하고 개방한 뒤, 해당 파일에 "Hello" 라는 문자열을 쓰는 로직이잖아요? 하지만 소스코드 레벨에서는 어쨌건 fp 라는 구조체 포인터를 할당하고 하는 과정에서 메모리(엄밀히 말하면 가상 메모리)를 사용하게 되고 있구요! 그러면 위 함수같이 순수하게 I/O 동작만 수행할 경우는 CPU는 전혀 관여하지 않고 유휴 상태라고 보면 되나요? 흔히, I/O Bound 작업에서는 CPU가 관여하는 부분이 없기 때문에 비동기로 처리한다고들 하는데.. 이 말은 I/O 작업에서는 CPU가 하나도 사용되지 않고 메모리와 파일 시스템과 상호작용하는 Kernel 정도만 사용한다고 보면 될까요? 약간 질문이 난해할 수 있을 것 같은데.. 답변 주시면 추가로 궁금한 점은 재질문 드리겠습니다!
원래는 malloc하고 memcpy를 모를때는 반복문으로 복사하고, 이후 free하고 다시 새로 malloc한 주소값을 대입하였습니다. 이번 강의에서 realloc을 배우고 이렇게 바꿀 수 있었습니다. 그러면 실제로 동적 배열 만들때는 주로 realloc을 사용할 것 같은데, 강사님께서 realloc을 쓸일이 거의 없다 고 하셨습니다. 설명해주신 미리 할당을 받아두고 memory pooling 을 구현하기 때문인가요? 아니면 대부분 동적이 아닌 예상할 수 있는 수치의 고정된 크기 로 잡을 수 있기 때문에 realloc할 일 조차 없기 때문인가요? 그도 아니면 c에도 동적 배열을 사용하기 위한 라이브러리 가 있어서 인가요? 항상 양질의 강의 제공에 감사드립니다.
Event Loop 함수에서 함수포인터 배열를 사용하여 Lookup 테이블 구조로 변경 하는 도중에 에러가 발생하여 질문 남깁니다! void (*EventFunc[EVENT_COUNT])(void) = { 0, AddNewUser, SearchByName, SearchByAge,PrintList, SearchByNameToRemove }; 위 코드와 같이 EVENT_COUNT 를 #define EVENT_COUNT 6 매크로로 정의 했을때 오류가 발생 합니다. void (*EventFunc[6])(void) = { 0, AddNewUser, SearchByName, SearchByAge,PrintList, SearchByNameToRemove }; EVENT_COUNT를 매크로로 정의 하지 않고 6으로 하드코딩 할때는 컴파일이 잘되는데 서로 다른 결과가 나오는 이유가 궁금합니다.
C#,C++ 관련 코드를 공부하기 위해서 비주얼 스튜디오 2019 버전을 다운로드 하려고 하는데 다운르도 홈페이지 들어가니깐 community 버전 다운로드 버튼이 활성화가 되어있지 않던데 혹시 다른 방법 아시는 분들 있는지 싶어서 글 작성해 봅니다 !!! 부탁드리겠습니다 ㅠㅠ
WM_LBUTTONDOWN 메시지는 View로 밖에 안가는 것 같은데, 해당 이벤트를 MainFrame에서 처리할 수 있는 방법은 없는걸까요? MainFrame 에 OnLButtonDown 핸들러를 아무리 설정해놓아도, MainFrame윈도우로는 버튼클릭 메시지가 안오는 것 같습니다. 이렇게, 윈도우에 따라 처리할 수 있는 메시지도 차이가 있는 것일까요??
안녕하세요! 현재 강사님의 동적 할당 메모리 강의에서 아래 예제 소스코드를 파헤쳐보고 있는데요! #include <stdio.h> #include <stdlib.h> int main(void) { int* pList = NULL; pList = (int*)malloc(sizeof(int) * 3); pList[0] = 10; pList[1] = 20; pList[2] = 30; for (int i = 0; i < 3; ++i) { printf("%d\n", pList[i]); } free(pList); return 0; } 그런데 디버그 모드로 실행하면서 메모리 뷰를 보고 있는데, 잘 이해가 되지 않는 지점이 있어 질문드립니다. (제가 개인적으로 MacOS를 사용해서 CLion 이라는 IDE를 쓰긴하는데, 강의 속 visual studio 처럼 메모리 뷰를 보는 기능은 동일하게 제공해주어서 제가 사용하는 IDE 첨부사진인 점 양해 부탁드리겠습니다 (__) ) 우선 break point를 아래처럼 라인 바이 라인으로 설정한 후 하나씩 실행해보고 있는데요. 한 step 씩 사진을 첨부하면서 설명을 하겠습니다. 1.정수 포인터 변수인 pList 에 주소 연산자(&)을 써서 "정수 포인터 변수의 메모리 주소"를 확인 => 64비트 운영체제 컴퓨터에서 포인터 변수는 8바이트(64비트) 크기를 차지하기에 이것은 이해가 됩니다 2.정수 포인터 변수인 pList를 메모리 윈도우에서 확인 => 이 부분이 명확히 잘 이해가 가지 않습니다. 일단 pList를 메모리 윈도우에 입력했을 때 pList가 '정수' 타입으로 선언했기 때문에 사진 속 초록색 영역이 4바이트(32비트) 크기인 것은 알겠는데, 초록색 영역에 들어있는 "ff c3 00 d1" 은 의미가 무엇인가요..? 사실 근본적으로 pList가 정수 포인터 변수인 것은 알겠는데, 메모리 윈도우에 pList 를 입력했을 때랑 &pList 입력했을 때의 차이가 명확하게 무엇인지 스스로에게 설명을 못하겠습니다.. 3.다음 break point로 한 step 실행한 뒤, pList에 주소 연산자(&)를 써서 메모리 윈도우를 확인 => 소스코드에서 pList에 NULL을 할당했기 때문에 아래 사진 속 메모리 윈도우에서 빨간색으로 변한 영역이 0으로 변한 것은 이해가 갑니다. 4. 3번 단계에서 메모리 윈도우에서 pList를 입력한 후 확인 => 이 부분도 잘 모르겠습니다. pList를 메모리 윈도우에 입력하니까 failed to read memory 메세지가 뜨면서 메모리를 읽지 못한다는 문제가 발생했는데, 왜 읽지 못하는 것인지.. 이해가 가질 않습니다. 5. 다음 break point로 한 step 실행한 뒤 pList를 메모리 윈도우에 입력한 후 확인 => 소스코드에서 malloc() 함수가 정의되어 있는 라인이 실행된 후에야 4번에서 발생한 문제가 사라지더라구요. 4번에서 발생한 문제의 원인을 모르니 5번에서 왜 문제가 해결되었는지도 연쇄적으로 잘 이해가 가지 않네요.. 혹시 위 5개 단계에서 제가 질문한 부분에 대해 답변 가능하신지 여쭙습니다. 동일한 visual studio 환경이 아니라 죄송합니다 ㅠ 천천히 답변주세요! 기다리겠습니다 🙂
안녕하세요, 좋은 강의 만들어주신 덕분에 오랜만에 몰입해서 프로젝트를 진행해보고 있습니다! 그런데 제가 지식이 부족하여 계속 모르는 부분들이 생기네요 ㅠㅠ 다름이 아니라, UDP DNS Response 패킷을 위조하여 먼저 보내는 방식으로 지금 방향을 바꾸었는데, 모든 조건이 동일하고 길이마저 동일하게 변조하여 보내서 wireshark에서는 정상 패킷으로 인식하여 먼저 온 응답으로 인식하는데 브라우저와 윈도우의 nslookup에 의한 명령어로 dns 를 조회할 때는 정상적인 응답만 받아들이고 제 위조 패킷은 먼저 왔음에도 받아들여주지 않습니다 ㅠㅠ 길이도 똑같이 맞추고, 다른 건 ipv4헤더의 identification값이 달라 ip와 udp 체크섬이 달라진다는 것 뿐인데.. 혹시 관련하여 어느 부분을 더 찾아봐야 할까요 검색을 해도 너무 나오는 부분이 없어 막막하여 질문드립니다..
안녕하세요~ 강의 열심히 따라가다가 그동안 배워온 것들 복습을 진행중입니다. 그러다가 함수 관련해서 질문이 있는데요! 강의 속에서 함수를 정의하면 해당 함수의 이름에는 배열처럼 메모리 주소가 할당된다고 하셨는데요! 좀 더 자세히 살펴볼려고 디버그 모드로 정의된 함수 이름에 어떤 메모리 주소가 들어가 있는지 살펴보고 있었습니다. Q1. 그런데 특이하게 디버그 모드를 최초로 실행할 때부터 함수 이름에 메모리 주소가 일종의 쓰레기값..(사진 속에서는 16진수로 ff 값이 적혀있네요)으로 정의되어 있고 이후 코드 실행 step 을 계속 실행시켜도 별다른 값으로 업데이트가 되지 않더라구요. 그렇다는 것은 런타임에 들어가기 전부터 빌드 타임에 함수 이름에는 메모리 주소가 최초로 1번만 할당되고 런타임 때는 할당되지 않는 것으로 이해하면 될까요?(마치 size of 연산자처럼 컴파일 연산자 처럼요..비교가 좀 다를 수 있긴 합니다만..) Q2. 함수의 메모리 주소도 포인터를 이용해서 막 여기 저기 활용하는 사례도 많나요??(마치 문자열이나 다른 배열을 포인터로 활용하는 것처럼..) Q3. 그리고 어쨌건 최초로 변수를 선언하고 정의할 때 메모리가 할당되는 시점은 무조건 빌드 타임에 할당되는 것이죠? 그러면 런타임에 메모리가 할당되는 시점도 있나요..? 자꾸 헷갈리네요! 혹시 질문이 이해가 안가신다면 답글 달아주세요! 감사합니다 :)
강사님께서는 VS를 통하여 영상을 올리셨습니다만, 많은 분들께서는 저처럼 VScode를 사용하고 있을거라 생각합니다 제가 서칭하여 얻은 결과가 도움이 될까하여 공유해봅니다 혹시 문제가 된다면 글 내리겠습니다! @@ 아래 과정은 영상의 코드를 그대로 사용합니다 -- 수정 -- VScode Extension에서 MemoryView를 검색하여 다운 영상의 예제코드, F5 클릭으로 디버깅 수행 그러면 하단 터미널 레이아웃 목록에서, MEMORY 목록이 뜰겁니다 클릭 해당 레이아웃 상단의 + 버튼을 클릭합니다 영상에서처럼 변수 이름을 입력합니다 ( &test ) ( 변수일 경우 &변수이름 , 배열일 경우 배열이름 입력 ) 이어서 디버깅 수행하시면 메모리 값을 볼 수 있습니다 저는 성공적으로 메모리값을 보고 있지만 혹시나 안되시는분들은 MemoryView Extension 관련해서 직접 찾아보길 바랍니다 :)
안녕하세요, 먼저 양질의 강의를 만들어 네트워크를 이해할 수 있는 실습도 준비해주셔서 정말 감사드립니다. 덕분에 정말 많은 인사이트를 얻어가는 듯 합니다. 이렇게 질문을 드리는 이유는 다름이 아니라, 유해사이트 차단 프로젝트를 해보는 중에 rst 플래그를 이용한 위조 패킷을 날려 dns 질의에 대한 응답을 차단시키는 방향으로 프로젝트를 진행해 보고 싶어 그런 방향으로 진행하였습니다. 어찌저찌 dns response 보다 빠르게 rst 패킷을 날리는데에는 성공하였고, DOH(Dns Over Https) 프로토콜을 사용하는 웹페이지들은 추적자체가 불가능하여 TCP+HTTP 연결을 사용하여 DNS 응답을 주는 사이트로 테스트를 해보고 있습니다. 문제는 RST 패킷이 제대로 인식은 됐는지 이후 ACK나 DNS 응답에 RST 패킷으로 DNS 서버에 응답을 주는데, 브라우저는 정상적으로 페이지를 로드를 한다는 것입니다. 제가 이해한 바로는 HTTP는 TCP 위에서 동작하는 것이니 연결이 종료된 포트로는 더이상 응답을 수신 안하고 무시해야 할 것 같은데.. 이해가 잘 되지 않습니다. 원인을 알 수 있을까요? 네트워크 스택이 달라 HTTP만 바라보는 브라우저 입장에선 TCP 스택인 RST 패킷이 오든 말든 상관 없는걸까요? Chat GPT는 브라우저에서 DNS를 처리하는 엔진에서 RST 패킷을 무시하는 로직이 있을 수 있다고 하는데 이것 때문일 지 궁금합니다.
안녕하세요 강사님 04_ListAndIndex의 원본 코드의 signleList.c파일의 SearchByIndexAgeRange함수의 354번째 줄 라인에서 int length = idxMax - idxMin + 1; USERDATA** aSelected = malloc(sizeof(void*) * length); memcpy(aSelected, aList + idxMin, sizeof(void*) * length); 와 같이 aSelected의 리턴 타입이 USERDATA** 인데 왜 malloc으로 생성할때, "malloc(sizeof(void*) * length);"로 왜 void*의 size만큼 생성해주는지 잘 모르겠습니다. USERDATA** aSelected = malloc(sizeof(USERDATA*) * length); 다음 위의 코드처럼 "malloc(sizeof(USERDATA*) length);"즉, USERDATA* 의 size가되어야 알맞지 않나요?? 아니면 USERDATA* 와 void* 모두 크기가 8byte라서 메모리가 할당되는 크기가 같은건가요?? 제가 알고 있는 개념이 맞는걸까요?? 강의 잘 듣고있습니다 감사합니다.
파일 플러싱 => Output에만 적용 => 메모리에 담긴 파일이 어딘가로 흘러 내보내진다는 의미 ex) Console 입/출력 => 장치 추상화 파일 CON의 구성요소 stdin, stdout는 각각 Buffer를 가지고 있음 => Process가 출력을 하면 Output Buffer에 출력할 내용이 쌓임 => Buffer가 비워지면서 Console에 출력 => 이 일련의 과정을 OS가 처리 이 과정에서 OS가 할 일이 많아지면 Buffer에 쌓이는 속도가 느려질 수 있음(Buffering) 이 때 빠르게 Buffer를 비워서 콘솔에 출력을 하고 싶을 때 fflush() 함수를 사용 이렇게 정리 해봤는데 맞게 이해한 걸까요?
안녕하세요 수업 잘 듣고있습니다 MFC수업중에 UI를 구성을 할 때에 Web기술(html,css)를 접목을 시켜야 야근이 줄어든다고 여러번 말씀 해주셨습니다 해당 기술을 공부를 해보려면 어떤 키워드로 구글에 검색을 해봐야 알 수가 있을까요? 검색을 해봐도 명확하지 않아 선생님께 여쭤봅니다
안녕하세요! 강의 속에서 아래 코드를 설명해주시면서 .. printf("%s\n", &szBuffer[4]); printf("%s\n", &*(szBuffer + 4)); 주소 지정 연산자와 간접 지정 연산자가 서로 반대이기 때문에 두 개가 만나면 없어진(?)다 라고 하셨는데요! 여기서 '서로 반대' 라는게 막 피부에 와닿게 잘 이해가 되지는 않네요.. 일단 그냥 암기해야 할까요..? 이 '서로 반대이다' 라는 뜻을 완벽히 이해한 것은 아닌데 다음 진도를 나가는 게 맞는 건가 싶어서요!