월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 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}
- 해결됨홍정모의 따라하며 배우는 C언어
printf(".20f",d) 출력 범위 질문
이렇게 커맨드를 쳤는데,이렇게 나왔습니다.그런데 제 출력값과 달리, 교수님은 3.141592....600 으로 끝이 반올림이 되었고, 그 이유로 double로 표현할 수 있는 자릿수의 한계때문에 그렇다고 말씀주셨습니다.근데 저는 왜 반올림이 안되고 끝까지 나온걸까요?release, x86 에서 실행했습니다!
- 미해결홍정모의 따라하며 배우는 C언어
vscode 실행이 안됩니다......정말 힘드네요
실행하려고 했더니 위와 같은 오류가 발생했습니다..... 제 나름대로 구글링도 해보고 깔려있는 json 파일에 들어가서 컴파일 경로도 수정해보고 configuration도 바꿨는데도 계속 오류가 나더군요....정말 너무 안 돼서 답답합니다 혹시 이 문제 어떻게 해결해야 할지 여쭤봐도 될까요? 도움 주신다면 정말 감사하겠습니다
- 미해결홍정모의 따라하며 배우는 C언어
1차 배열과 2차 배열에서 *ptr의 차이
1차 배열에서 *ptr은 해당 첫번째 메모리의 값이엿는데2차 배열에서 *ptr은 메모리값이 아니라 첫번째 메모리의 주손가요??
- 해결됨홍정모의 따라하며 배우는 C언어
배열로 예제를 풀면서 궁금했던 점.
#include <stdio.h>#include <stdbool.h>int library[100], number, bignumber, smallnumber, samenumber[100]; int i, sum, trial, same, last = 0;int main(){printf("Type your number : "); for(;scanf("%d", &number) != 0; i++) { library[i] = number; sum += number; } // i 는 반복한 횟수에서 한 번 더 더해지고 끝난다.printf("\n%d\n", sum);for(int a = 0;a != i + 1;a++) { for (int b = 0; b != i + 1;b++) { if(library[a] < library[b]) trial++; if (library[a] == library[b] && a != b) { same++; samenumber[a] = library[a]; } } if (trial == 0) bignumber = library[a]; if(trial == i - 1) smallnumber = library[a]; if(same > 0) { for (int c = 0;c != i + 1; c++) { if (samenumber[a] < library[c]) last++; } if (last == i - same - 1) smallnumber = samenumber[a]; } trial = 0; }printf("Biggest number : %d, Smallest number : %d, Mean : %f", bignumber, smallnumber, (float)sum / (float)i);return 0;} 이렇게 코드를 작성하여 예제 구현을 마쳤습니다. 배열을 사용해 수를 지정하고, 일일히 비교하는 제 방식을 쓰다가, 강의를 보니 맥이 빠지더군요....ㅋㅋ 제 질문은 library 주소에 미리 100개의 공간을 할당해두었는데, 만약 사용자가 100번 이상 수를 입력했을 때에도 프로그램이 원활하게 돌아가기 위한 대책입니다. 제가 입력한 횟수만큼만 library에 할당된 공간을 늘릴 수 있을까요?
- 미해결홍정모의 따라하며 배우는 C언어
scanf와 버퍼 질문
scanf 함수는 입력 버퍼에서 개행 문자는 가져오지 않고 내버려두는 것이라고 들었습니다.제가 궁금한 점은 만약 scanf 함수를 연달아 쓴다면 다음 입력 버퍼의 처음에 개행 문자가 있어서 오류를 일으키지 않느냐는 것입니다.예를 들어 scanf("%d", &i1); scanf("%d", &i2) 라고 작성했을 때 첫번째 scanf에서 10을 입력하고 엔터를 쳤다고 가정하면 입력 버퍼에는 10과 \n이 들어가는데, scanf 함수는 \n은 읽어들이지 않아서 입력 버퍼에 그대로 남게 되는 것이 아닌가요? 제 생각엔 버퍼 지우기 while을 두 개의 scanf 함수 사이에 넣어야 버퍼를 비울 수 있다고 생각했는데 해보면 정상작동이 되는 이유가 궁금해요..
- 미해결홍정모의 따라하며 배우는 C언어
이렇게 간단한 것도 구현 못하는 거면 심각한가요?
이중 for문 자체는 이해를 하고 있는데 아예 떠올리질 못했습니다...이런 경우엔 뭘 해야 하나요? 복습한다고 해서 의미가 있을까요?
- 해결됨홍정모의 따라하며 배우는 C언어
3분 40초경 질문
3분 40초경의 교수님 설명을 듣고void swap(char** xp, char** yp){char* temp = *xp;xp = yp;*yp = temp;}void selectionSort(char* arr[], int n){int i, j, min_idx;for (i = 0; i < n - 1; i++) // Note n - 1{min_idx = i;for (j = i + 1; j < n; j++) // Note i + 1{if (strcmp(arr[min_idx], arr[j]) == 1) //if (arr[min_idx] > arr[j])min_idx = j;}swap(&arr[i], &arr[min_idx]);}} 를 void swap(char* xp, char* yp){char* temp = xp;xp = yp;yp = temp;}void selectionSort(char* arr[], int n){int i, j, min_idx;for (i = 0; i < n - 1; i++) // Note n - 1{min_idx = i;for (j = i + 1; j < n; j++) // Note i + 1{if (strcmp(arr[min_idx], arr[j]) == 1) //if (arr[min_idx] > arr[j])min_idx = j;}swap(arr[i], arr[min_idx]);}}예제를 이렇게 바꿔봤습니다.포인터 변수의 주소를 넘겨주는 대신에 포인터 자체를 넘겨주고swap 함수 안의 xp나 yp에 *를 때주면 첫 번째 예제와 두 번째 예제가 같아지는 것 아닌가요?뭐가 잘못된건지 이해가 가질 않습니다. 추가로 swap 함수에 대해서 설명을 해봤는데 제 설명이 맞는건지 알려주시면 감사하겠습니다. swap의 매개변수를 char**로 적은 이유는 넘겨줄 게 포인터 변수의 주소라 char에 **를 붙여줬기 때문이다.그리고 swap 함수 안에서 xp나 yp에 *를 붙인 이유는 매개변수로 넘겨준 건arr[i], arr[min_idx]라는 포인터의 주소이고 스왑 해줘야 할 건 그 포인터의 메모리 공간에 있는 주소값이기 때문이다.
- 해결됨홍정모의 따라하며 배우는 C언어
13분경 질문
https://www.inflearn.com/questions/445486이 질문의 답변에서strncpy는 복사 하려는 공간이 복사 대상보다 클 경우 null value로 채워주는 것으로 알고 있습니다.라고 말씀을 해주시는데그러면 char dest[100] = ""; // make sure memory is enoughchar source[] = "Start programming!";strcpy(dest, source);strncpy(dest, source, 5); 이걸 실행 했을 때 Start만 출력이 되어야 하는 거 아닌가요?근데 교수님은 Start가 복사 될 때 복사 될 문자열에 NULL 캐릭터가 없어서위의 예제를 실행하면 Start programming!가 전부 출력 된다고 말씀하셨고 실제로 그렇게 됐잖아요교수님 말씀이 맞는건지 아니면 제가 답변자님 답변을 잘못 이해한 것인지 잘 모르겠네요source가 들어갈 dest에 이미 데이터가 들어가 있어서 나머지 공간을 NULL 캐릭터로 채워주지 않은거라고 해석해도 될까요? 그리고 Start programming!이 전부 출력되는 이유를 제가 강의를 듣고 나름대로 설명해 봤는데 이게 맞는지 모르곘네요.위의 예제를 실행시키면 "Start”만 출력을 할 것 같지만"Start programming!" 전부를 출력하는데 그 이유는strncpy() 함수에서 원본을 복사해서 넣을 때 복사본의 맨 마지막에NULL 캐릭터를 추가해주지 않고 문자열을 복사해서 넣어줄 공간만 신경 쓰지 그 외의 공간은 신경 쓰지 않기 때문이다.(dest에서 Start가 들어갈 공간만 신경 쓰지 나머지 공간은 신경 쓰지 않는다는 뜻)라고 설명을 해봤어요