#include <stdio.h> #include <stdlib.h> int main(void) { char szBuffer[4] = { 0 }; scanf_s("%4c", szBuffer, _countof(szBuffer)); printf("%c%c%c%c\n", szBuffer[0], szBuffer[1], szBuffer[2], szBuffer[3]); return 0; } 위 코드를 똑같이 따라했는데 scanf_s 에 countof 크기 불일치 unsigned 가 나옵니다. 환경 설정도 똑같이 했는데 강사님은 왜 오류가 안나고 저는 나는 걸까요? countof 가 매크로라고 하셨는데 그거랑 무슨 상관이 있는걸까요? 저와 강사님이 쓰는 _countof 함수는 같은거 아닌가요?
강의 내용 중에 궁금한 점이 있어 질문드립니다. #include <stdio.h> int main(void) { char szName[32] = { 0 }; int nAge = 0; printf("나이를 입력하세요. : "); scanf_s("%d", &nAge); printf("이름을 입력하세요 : "); gets_s(szName, sizeof(szName)); return 0; } 처음에는 szName 과 nAge 는 서로 다른 변수이므로 각각 다른 메모리 주소를 갖는다고 생각했습니다. 그래서 scanf_s("%d", &nAge) 를 호출하면 사용자가 입력한 값이 nAge 의 메모리 주소에 저장되고, gets_s(szName, sizeof(szName)) 를 호출하면 입력한 값이 szName 의 메모리 주소에 저장되므로, 두 변수는 서로 다른 메모리 공간을 사용하기 때문에 scanf_s() 에서 입력받은 \n 이 gets_s() 에 영향을 주지 않을 것이라고 생각했습니다. 하지만 실제로는 scanf_s() 로 나이를 입력한 뒤 gets_s() 가 별도의 입력을 받지 않고 바로 종료되었습니다. 강의에서 설명해 주신 내용처럼 scanf_s() 가 남겨 놓은 \n 을 gets_s() 가 읽었기 때문이라고 이해했습니다. 이 부분이 궁금해서 강의를 다시보며 아래와 같이 이해했는데, 제가 이해한 내용이 맞는지 확인 부탁드립니다. - szName 과 nAge 는 서로 다른 메모리 주소를 갖는다. -하지만 scanf_s() , gets_s() 와 같은 입력 함수들은 각 변수의 메모리에서 직접 입력을 받는 것이 아니라, 공통으로 사용하는 stdin 입력 버퍼 에서 데이터를 읽는다. * 이 입력 버퍼는 szName, nAge와 같은 메모리 공간이 아닌 강의 중 강사님이 설명하신 추상화 File의 단 1개의 Buffered I/O로 이해했습니다. -즉, 키보드 입력은 먼저 stdin 의 입력 버퍼에 저장되고, scanf_s() 와 gets_s() 는 이 동일한 입력 버퍼에서 필요한 만큼 데이터를 읽어 각각 nAge 와 szName 에 저장한다. -따라서 scanf_s("%d", &nAge) 는 숫자만 읽고 \n 은 입력 버퍼에 남겨 두며, 이후 gets_s() 가 같은 입력 버퍼에서 남아 있던 \n 을 읽어 바로 종료된다. 제가 위와 같이 이해한 것이 맞는지 확인 부탁드립니다.
강의를 여러번 봐도 이 부분에 대한 설명이 이해가 안되어서 되도록이면 자제했던 AI의 도움을 받았습니다. 그 결과 알아낸 내용은 다음과 같습니다. scanf()에서 "%d\n" 의 의미는 “모든 공백(스페이스, 탭, 개행)을 계속 건너뛰고, 그 다음 ‘공백이 아닌 입력’이 나올 때까지 기다려라” 입니다. 그러니까 엔터를 치면 또 공백이 입력되니까 계속 대기상태가 되는 겁니다. 이 부분은 강사님 설명이 많이 부족했다고 생각합니다. 여러 강의들을 보면서 느끼는 건데, 자부심이 상당하신듯 한데 그게 지나쳐 거만함이 자주 드러나는 것 같습니다. 또 이런 성향이 귀찮은듯 툭툭 내뱉는 말투로도 자주 표현이 되는 것 같고요. 수강자 입장에서 거슬리지만, 그런 성향이 불성실한 강의로 이어지지만 않으면 괜찮습니다.
안녕하세요. 강의를 듣다가 궁금증이 생겨 문의합니다. 제가 공부했을경우에는 Memory, Virtual Memory, Memory Mapping Tables가 있어서 CPU가 특정 메모리 영역을 읽고 싶을때 VM과 Mapping Table을 활용해서 Memory에 올라온 값을 읽는 것으로 알고 있는데, 강의에서 설명하실때는 Mapping table에 관한 내용이 없어서요. 제가 공부할 때에는 Linux를 기반으로 공부를 하긴 했습니다만, 윈도우는 Mapping table을 사용하지 않는 걸까요...?
안녕하세요 강사님. 버블정렬을 구현하면서 의문점이 생겨 질문을 남김니다. 저는 값의 교환에 사용되는 tmp변수의 선언을 반복문 외부, 즉 반복문보다 먼저 선언을 했고 그 이유는 매번 값을 교환할 때마다 변수를 선언하는것이 비효율적이라고 생각했습니다. 질문1. 반복문 내부에서 변수를 매번 선언하는것이 정말 비효율적인가? 질문2. tmp변수를 반복문보다 먼저 선언하고 활용하는 것이 정말 효율적인가? 잠재적인 리스크는 없는가? 첨부자료로 제 소스코드 캡처본과 강의 타임라인을 남기겠습니다! 13:41 ->오류 발견 및 반복문 내부 최종완성
20:10 쯤에 메모리 비교같은 경우는 비교연산자로 되지 않기 때문에 반드시 전용함수를 사용해야한다 라고 하셨는데, for루프를 돌면서 비교연산자를 사용해서 비교 가능하지 않나요?? 그리고 memcmp()이 내부적으로 == 를 사용하지않고 두 요소를 빼는 방법을 사용하는 이유가 궁금합니다.
안녕하세요. 만약 우리가 Console 에서 Love 라고 입력하고 엔터를 치면, Read File Buffer 에는 당연히 Null 이 있는게 아니라 L o v e \n 이렇게 5 바이트 가 저장되는건가요? 그렇지만 이게 RAM 으로 넘어가면서 NULL 이 생기는건가요 ? 수업시간에 문자열의 경우, NULL 이 있다고 말씀해주셨는데 잘 이해가 안가서 여쭤봅니다.
안녕하세요. 본 강의에서 Callee 가 동적 메모리 주소를 반환하고, Caller 가 나중에 그 동적 메모리를 free 를 통해 해제하는 구조에 문제가 있다고 하셨는데, 어떤 문제가 있는 것인지 구체적으로 잘 감이 잡히지 않습니다. 멀티 스레딩과 연관지어 설명해주시면 감사하겠습니다.
안녕하세요. char* astrList[3] = { "Hello", "World", "String" }; 이라고 선언했을 때는 각 정적 메모리 영역에 들어가는 문자열 상수의 시작 주소가 배열에 저장된다는 것은 알겠습니다. 그런데, char astrList[] = "Hello"; 라는 식으로 선언했을 때는 해당 문자열 상수가 아니라 그 복사본이 저장된다고 하셨는데, 그 원리가 정확히 무엇인지 궁금합니다. 해당 강의에서 등장한, printf("%s\n", astrList[0] + 2); 혹은 printf("%c\n", astrList[0][3]) 등을 실무에서 주로 어떤 식으로 사용하게 되는지 간단하게라도 예시를 들어주시면 감사하겠습니다.
char 자료형을 가진 데이터는 항상 1byte 씩만을 차지하고, 그것을 가리키는 포인터는 64bit 체계 기준으로 항상 8byte 인 것으로 이해했습니다. 그런데 동영상 2:40초부터 "1바이트라는 공간마다 64비트가 붙어 있는 게 아니다" 라고 말씀하셨는데, 위에 제가 이해한 내용이 틀리다는 의미일까요? 감사합니다.