월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C언어
scanf문 실행 순서 다름
(수정) - 엔터가 다 사라져서 저장이 됬네요;;안녕하세요, 코드는 하기와 같이 교수님과 똑같이 적었습니다. char str[255];int i, i2;double d;scanf("%s %d %lf\n", str, &i, &d); // hello 3 3.14printf("%s %d %f\n", str, i, d); scanf("%s %d %d\n", str, &i, &i2); // abc 1 1.23printf("%s %d %d\n", str, i, i2);그런데 실행 순서가 다릅니다. 강의 영상처럼 첫번째 scanf가 실행되고 바로 printf 가 실행된 후 두번째 scanf가 실행되는게 아니라, 한꺼번에 입력을 받고 한꺼번에 출력합니다... 뭐가 문제일까요? 디버거로 찍어봤는데 하기와 같습니다.release 모드로 돌렸는데 그거랑은 상관없겠죠..?
- 미해결홍정모의 따라하며 배우는 C언어
3.1-6분
표에 나오는 십진수 정밀도란 무엇을 뜻하나요?
- 미해결홍정모의 따라하며 배우는 C언어
제가 이해한 것이 맞는지 긴가민가해요
int arr[2][3] = { {1,2,3},{4,5,6} };에서결과적으로 주소값은 모두 같겠지만 배열명 arr이 가르키는 것은 이차원 배열의 첫번째 행이고, arr[0]이 가르키는 것은 배열의 첫번째 행의 첫번째 원소가 맞나요?
- 해결됨홍정모의 따라하며 배우는 C언어
5분 41초경 7분 45초경 질문
여기서객체가 생기는 위치가 딱 고정되어 있냐 아니냐 그 기준으로 보시면 됩니다.이 부분이 잘 이해가 안되는데객체가 생기는 메모리의 위치가 객체가 고정되는 특징(데이터 또는 BSS segment의 특징?)을 가지고 있냐 아니냐이렇게 교수님 말씀을 이해해도 괜찮을까요? 그리고7분 45초 에서 교수님이 하시는 말씀의 순서가 좀 복잡해서 이해가 잘 안됬는데사실은 프로그래머들이 편리하도록 자동적으로 영역과 지속 기간을 관리해주는 성질을 가질 수 있게스택이란 공간을 만들고 거기에 저장을 하는 것이다.라고 제가 정리를 좀 해봤어요 이 정리가 맞는 표현인가요? 항상 좋은 답변 정말 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
12분 경 질문
여기서 i=3이라고 했을 때 printf에서 왜 2로 출력되는지 궁금합니다. 감소 연산자 시그널이 없어서 3으로 나와야 하는 것이 아닌 건가요?
- 미해결홍정모의 따라하며 배우는 C언어
10분 58초 경 질문
전위 연산자가 붙어있는 j에서 일단 증가를 시키고 대입한다고 하셨는데 그게 무슨 뜻인지 이해가 되지 않습니다.
- 미해결홍정모의 따라하며 배우는 C언어
4분 33초 경에 질문이 있습니다.
&arr[0][0]은 그냥 주소값이지 포인터가 아니지 않나요? 너무 헷갈립니다..ㅠ주소값에다 정수를 더해서 너무 혼란스럽습니다... 이게 포인터면 +1을 하면 int 크기만큼 건너뛴다는건 알겠는데 저건 주소값인데 +1을 할 수 있는건가요?
- 미해결홍정모의 따라하며 배우는 C언어
scanf()가 잘못된 입력을 읽을 때 행동
안녕하세요,이 코드에서 'a 2 3 '을 입력 후 'b 4 5'를 입력하면, 두번째 while문이 돌아갈때 입력버퍼에 남아있는 ' \nb 4 5' 중 ' '는 c로 들어가고, 다음 %d를 읽으려 할때 '\n' 와 %d가 매칭되지 않아 scanf가 종료되고, rows와 cols는 기존 2 와 3이 유지되어 하기와 같이 결과가 나오는 것을 이해를 했습니다.핵심은 버퍼에 남아있는 ' \nb 4 5' 중 '\n'은 scanf가 읽다가 포기하고 버려졌다 라는 건데요,(이게 스트림이 옮겨졌다고 표현하는게 맞나요?) 이를 테스트하기 위해 하기와 같이 코드를 짜봤는데, 또 아닌 것 같아서요..만약 제가 깨달은게 사실이라면,제가 예상한 결과 ->이 코드를 실행시키고 입력창에 'hello'를 입력하고 엔터를 치는 순간 입력 버퍼에 'hello\n' 이 들어가게되고,첫번째 while문의 scanf() 가 실행될때 %d와 hello가 매칭되지 않으므로 scanf를 종료. scanf가 비정상적으로 종료되었으므로, 입력버퍼에 있는 'hello\n'에서 hello는 버려지고, \n으로 스트림이 옮겨짐. 두번째 while문 조건에서 c에는 \n이 저장되고, 조건문이 거짓이므로 바로 break;가 실행되어 종료됨.실제 결과 ->두번째 while문의 putchar까지 실행됨. 왜 차이가 발생한건지 궁금합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
5분 35초경 질문
헤더파일 안에서 static으로 변수를 선언해줘도 되는 이유는C파일에서 그 헤더파일을 불러왔을 때그 C파일의 파일 스코프에서 static으로 변수를 선언 해주는 것과 같아서인가요?얘를 들어 #pragma oncestatic const double PI = 3.141592;static const double gravity = 9.8;이런 내용의 PIgravity.h라는 이름의 헤더 파일이 있고 main.c 파일에서#include "PIgravity.h"이렇게 해주면main.c 파일의 파일 스코프에static const double PI = 3.141592;static const double gravity = 9.8;이렇게 선언된 것과 비슷한 거라서 가능한건가요?
- 해결됨홍정모의 따라하며 배우는 C언어
realloc() 함수 질문이 있습니다.
int* ptr = NULL;ptr = (int*)calloc(n, sizeof(int)); // contiguous allocation if (!ptr) exit(1); for (int i = 0; i < n; ++i) printf("%d ", ptr[i]);printf("\n"); for (int i = 0; i < n; ++i) ptr[i] = i + 1; n = 20; int* ptr2 = NULL;ptr2 = (int*)realloc(ptr, n * sizeof(int)); realloc() 함수에서 메모리를 새로 할당 해줄 수 없을 경우 NULL 값을 반환해준다고 했는데그 때 원래 있던 ptr은 어떻게 되는 건가요? 그대로 남아있는 건가요 아니면 free를 한 상태가 되는 것 인가요?realloc() 함수는 원래 있던 포인터에 대한 할당 받은 메모리 공간은 free를 한 상태로 바꿔준다고 했는데이렇게 NULL 값을 반환해 줄 때도 원래 있던 메모리 공간을 free한 상태로 바꿔주는 건지 궁금해서요 항상 좋은 답변 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
_getche() 엔터키 입력시 커서가 맨 앞으로 돌아가는 이유
안녕하세요,abc 입력하면이렇게 a에서 깜박깜박 다음 신호 입력을 대기하는 상태가 되는데요, 그 이유를 추측해봤습니다.1, _getche 는 엔터키를 만나면 '\r' 을 반환. getchar()는 '\n' 을 반환.2, '\r' 는 carriage return, 캐리지 리턴이라고 해서 커서를 현재 줄의 맨 앞으로 이동시킴. '\n' 은 new lien, 이 문자는 커서를 다음 줄로 이동시킴.3, 따라서 abc를 입력하고 엔터키를 누르는 순간 putchar('\n')가 아닌 putchar('\r') 가 실행되어 커서가 맨 앞으로 이동.4, 종료조건인 ch != '\r' 에 해당되지도 않으므로 (ch는 '\t') while문이 종료되지 않고 다음 입력을 기다림. 맞나요?? 디버거 찍어보니까 ch가 '\r' 이더라구요 '\n'일줄 알았는데 -_-;; 시간 날린거같아서 짜증납니다ㅠ
- 해결됨홍정모의 따라하며 배우는 C언어
defining declaration이 뭔지 이해가 안됩니다.
전 강의에서도 교수님이 직접적으로 설명을 해주진 않으신 것 같은데그래서 그런지 이게 정확히 뭔지 감이 안 잡히네요. 좀 알려주세요! 항상 좋은 답변 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
이중포인터
char* arr[] = { "Cherry", "AppleBee", "Pineapple", "Apple", "Orange" }; 인 상태입니다. 이때 swap함수는 void swap(char** a, char** b) { int temp = *a; *a = *b; *b = temp; } 이고 swap(&arr[i], &arr[min_idx]);를 했을 때 두 주소값이 바뀌는 걸 알 수 있습니다. 그런데 이때 파라미터가 이중포인터인 이유가 조금 햇갈립니다. swap함수에 있는 파라미터 a와 b는 그 함수에서만 작동하는 게 아니라 직접 arr함수의 메모리에 작동해야되기 때문에 포인터를 쓰는 것이잖아요? 이떄 a와 b는 각각 그 주소의 포인터가 될 것인데 이때 그냥 포인터가 아니라 이중포인터가 붙는 이유는 arr 자체가 포인터의 배열로서 이중포인터니까 접근하려면 이중포인터 표시를 해야된다라고 생각하면 될까요? (이정도만 생각하면 되는 건지 고민이네요) 만약 그렇다면 이때 a와 b에 디퍼런싱을 한 번만 해서 값을 바꾸는 이유는 우리가 바꾸려는 건 주소값이지 글자 하나를 바꾸는 게 아니기 떄문이다 라고 생각하면 될까요?
- 미해결홍정모의 따라하며 배우는 C언어
포인터에 [ ]을 붙이는건 새로운 문법인가요??
ptr[k]부분이 이해가 가질 않아서요...다른 분들이 올린 질문도 봤는데 2차원 배열도 결국엔 1차원으로 정렬된 메모리라는건 어느정도 이해가 된 것 같은데...포인터 옆에 [ ]를 붙이는 것이 간접 참조 연산자랑 같은 기능을 하는건지 궁금합니다..
- 해결됨홍정모의 따라하며 배우는 C언어
tool() 함수 위치에 따른 에러
안녕하세요,main.c 와 second.c 에서 각각 하기와 같이 적어봤습니다.프로그램을 실행시키면, 하기와 같은 에러가 뜨는데요, undefined warning이 뜨는 이유는 main()함수에서 fun_second()를 실행시, fun_second()로 가서 tool()함수를 실행하려 했으나 전방선언이 되어있는것도 아니고 함수 선언부+몸체가 fun_second() 보다 앞쪽에 정의되있지 않기때문에 tool()함수를 발견할 수 없어 undfined에러가 뜬 것으로 이해했습니다.그런데 redefinition 에러가 뜬건 이해가 잘 되지 않습니다.tool()함수는 fun_second()아래 한번만 정의했는데 어째서 중복 정의라는 에러가 뜬걸까요??수박님 제가 질문한 글에 달아주신 답변 말고도, 다른 질문글에 달아주신 답변들이 독학하는데 정말 큰 도움이 됩니다. 항상 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
int* 만큼 이동한다는 말의 뜻이 궁금합니다.
안녕하세요, 이전 질문글의 답변에서 궁금한 점이 있어 질문드립니다. 링크는 https://www.inflearn.com/course/lecture?courseSlug=following-c&unitId=28273&tab=community&category=questionDetail&q=1142021 이고, 스샷으로 가져왔습니다. 밑줄 친 부분이 이해가 잘 가지 않는데요,arr 배열의 원소타입이 int 이므로 , arr + 1 은 arr[1]을 가리키는 포인터의 위치로 이동한다는 건 잘 알겠습니다. arr, 즉, arr[0]의 주소가 만약 100이면 104 로 이동하겠죠. int 크기가 4바이트니까요.그렇다면, parr + 1도 int* 크기만큼 이동해야 할 것 같은데요, int* 는 주소값을 저장하는 타입이므로 주소값의 크기인 4바이트(혹은 운영체제에 따라 8바이트) 만큼 이동해야 할 것같은데, 하기 첨부한 그림을 보면 parr[0] 시작 주소 부터 parr[1] 시작 주소까지 12바이트를 이동합니다. 직관적으로는 그럴것 같은데 헷갈려서 질문드립니다. 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
* (asterisk) 가 초기화문에서 사용될때, 할당문에서 사용될때 차이.
안녕하세요,초기화문에서 *가 사용될땐 주소가 저장되고,일반 명령문에서 변수앞에 *를 붙이면 앞의 경우와 다르게 redirection 연산자로서 사용되는데 그냥 암기해야 되나요? 간단한 예를 들면, int *a = 0x0077*a = 123;위 두 문장의 의미는 각각 int 포인터 변수 a 를 선언하며 0x0077 이라는 주소값을 a 에 저장. a가 가리키는 주소(0x0077)에 접근하여 123을 저장. 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
함수 선언부와 정의부가 다른 파일에 있어도 빌드가 되는 원리.
안녕하세요,강의에서main.c 파일 안에 #include "my_print_fucntions.h"를 통해 my_print_functions.h를 main파일에 인클루드해주면, 함수의 선언부만 main.c에 복붙이 됩니다. 선언부는 main.c안에 놓이는거겠죠.그런데 이 때, #include "my_print_fucntions.c" , 함수의 바디가 정의되어있는 my_print_fucntions.c 파일을 main.c 안에서 인클루드해주지 않아도 되는 이유는, 링커가 알아서 함수를 찾아 연결해주기 때문이고, 그렇게 되는 이유는 헤더파일의 함수 선언부에서 extern 키워드가 생략되어있어서 그렇다고 봐도 될까요?( (extern) void print_hello(); 이렇게요.) 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
7분 28초경 질문
저번에 아무 생각 없이 지나쳤던 부분을복습을 하면서 다시 보니 뭔가 이상해서 질문을 드립니다.교수님이 arr2d를 인디렉션을 하면 arr2d[0]이 나온다고 하셨는데저 생각으로는 &arr2d[0][[0]이 나오거든요아마 제가 틀린걸거라고 생각은 하는데 교수님 말씀이 잘 이해가 안되네요arr2d는 &arr2d[0]이고(arr2d[0]을 가리키고)arr2d[0]은 &arr2d[0][0]이니(arr2d[0][0]을 가리키니)arr2d를 인디렉션하면 &arr2d[0][0]이 나오는 게 제 생각에서는 맞는건데...제가 지금까지 공부하면서 만든 복습노트를 봐도 제 생각에서는 &arr2d[0][0]이 맞는데역시 제가 틀린거겠죠?아니면 교수님 설명을 제가 다른 뜻으로 이해를 한 것 인가요?
- 미해결홍정모의 따라하며 배우는 C언어
저번에 VS code 실행이 안된다고 글 남긴 수강생입니다......
교수님께서 말씀하신 깃허브 내용대로 c/c++ runner도 깔고 json 코드도 일부 수정했는데 여전히 실행이 안됩니다 뭐가 문제일까요.....아래에 launch.json 코드도 남기겠습니다. 그리고 말씀하신 xcode가 xcode-select 말씀하시는 거면 깔려있습니다. 제발 뭐가 문제인지 알고 싶네요 ㅜㅜ 초보라서 아직 개발 환경 설정 이런 데는 정말 다루기가 어렵습니다..... <launch.json> "version": "0.2.0", "configurations": [ { "type": "lldb", "request": "launch", "name": "Debug", "program": "${workspaceFolder}/<executable file>", "args": ["-std=c++17"], "cwd": "${workspaceFolder}" }, { "name": "C/C++ Runner: Debug Session", "type": "lldb", "request": "launch", "args": ["-std=c++17"], "cwd": "/Users/brian/Downloads/Visual Studio Code 2.app/Contents/Practice", "program": "/Users/brian/Downloads/Visual Studio Code 2.app/Contents/Practice/build/Debug/outDebug" <c_cpp_properties>"configurations": [ { "name": "macos-clang-x64", "includePath": [ "${workspaceFolder}/**" ], "compilerPath": "/usr/bin/clang", "cStandard": "c17", "cppStandard": "c++17", "intelliSenseMode": "macos-clang-x64", "compilerArgs": [ "" ] } ], "version": 4}