월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C언어
char* arr[]
만들어진 함수의 매개변수를 보면 '[]'가 붙을 때가 있고 그렇지 않을 때가 있음을 선생님의 코드 속에서 살펴볼 수 있는데요, 어느 때 붙고 어느 때 붙지 않는 건가요? 우선, 이전 강의에서 숫자를 선택정렬 할 때는 만들어진 함수에 []가 쓰이지 않았었습니다
- 미해결홍정모의 따라하며 배우는 C언어
헤더 파일을 잘못 클릭해서 리소스 파일에 들어갓는데...
헤더 파일이 리소스 파일에 들어가있는데 어떻게 빼나요?ㅠㅠ
- 미해결홍정모의 따라하며 배우는 C언어
4.9 Printf() 함수가 인자들을 해석하는 과정에서 질문있습니다.
안녕하세요.Printf 함수가 인자들을 해석하는 과정 관련해서 질문있습니다.교수님께서 설명해주신 내용은 이해했습니다.다만, float과 double 모두 메모리에 스택으로 저장되는 과정에서원래 4바이트인 float이 8바이트로, 원래 8바이트인 double이 8바이트로 변환되어 저장되게 되는데, 그렇다면 float의 경우 8바이트 중 실제 사용되는(값이 저장되는 공간) 공간은 4바이트 뿐이니, 4바이트는 낭비된다고 생각해야 되나요? 아니면, 원래 값은 4바이트 크기로 저장되나,변환과정에서 4바이트가 8바이트를 모두 사용되도록 내부에 저장되는 값까지 변환되는 것인가요? 만약 전자(8바이트 중 앞의 4바이트만 사용)라면, 메모리의 float이 사용하는 공간을 제외한 뒤에 있는 4바이트에 다른 값을 저장하더라도 실제로는 아무런 문제가 없게 될것 같아서요. 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
system bus에 관한 질문입니다
cpu, memory, 입출력 장치의 물리적인 구조를 앞 강의들에서 설명해주셔서 컴퓨터의 어떤 부분인지 알겠는데 system bus는 컴퓨터의 어떤부분인지 궁금합니다예를들어 하드웨어적인 부분은 아니고 운영체제 의 커널의 역할 인가요?, 또 다른 소프트웨어적인 부분인가요?
- 해결됨홍정모의 따라하며 배우는 C언어
11.4 문자열을 입력받는 다양한 방법들 15분 40초 Warning이 뜨는 이유?
warning C4047: '!=': 'int (__cdecl *)(void)'의 간접 참조 수준이 'int'과(와) 다릅니다.>> 위와 같은 경고가 뜨길래 원래의 코드에서 words[i] 배열의 원소를 (int)로 캐스팅하니까 경고가 뜨지 않더라구요. 혹시 이유를 알 수 있을까요? /* fgets() and fputs() */ char words[STRLEN] = ""; fgets(words, STRLEN, stdin); int i = 0; while ((int)words[i] != '\n' && (int)words[i] != '\0') { i++; } if ((int)words[i] == '\n') { fwords[i] = '\0'; } fputs(words, stdout); fputs("\nEND", stdout);
- 해결됨홍정모의 따라하며 배우는 C언어
버퍼가 헷갈려요
int get_integer() { int input; char c; while (scanf("%d", &input) != 1) { while ((c = getchar()) != '\n') putchar(c); printf(" is not an integer.\n Please try again : "); } return input; }제가 맞게 이해한건지 모르겠는데여기서 putchar(c)에 들어가는건 while (scanf("%d", &input) != 1)에서 scanf의 형식지정자가 맞지않아 뱉어낸 버퍼에 남아있던 값이 맞나요?
- 미해결홍정모의 따라하며 배우는 C언어
(1:40) flexible array member을 갖는 구조체, 스택 vs 힙 메모리 위치가 궁금합니다.
★작성하다보니 글이 길어졌는데, 번호로 굵은 표시해놓은 부분과 그림만 살펴봐주셔도 될 것 같습니다.--------------------#define CRTSECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>int main(){/*Flexible array member (struct hack in GCC)*/struct flex{size_t count;double average;double values[]; //flexible array member (last member!)};const size_t n = 3;printf("%zd\n", sizeof(float));struct flex* pf = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double));if (pf == NULL) exit(1);printf("%lld\n", (long long)pf);printf("%lld\n", (long long)&pf->count);printf("%zd\n", sizeof(pf->count));printf("%lld\n", (long long)&pf->average);printf("Address of pf->values %lld\n", (long long)&pf->values);printf("Value of pf->values %lld\n", (long long)pf->values);printf("Sizeof pf->values %zd\n", sizeof(pf->values));pf->count = n;pf->values[0] = 1.1;pf->values[1] = 2.1;pf->values[2] = 3.1;pf->average = 0.0;for (unsigned i = 0; i < pf->count; ++i)pf->average += pf->values[i];pf->average /= (double)pf->count;printf("Average = %f\n", pf->average);현재 구조체 flex는 main함수 내에서 선언하여 스택 메모리에 위치하고 있습니다.구조체 flex의 멤버 size_t형 count와 double형 average는 구조체 포인터가 선언됨과 동시에 스택에 메모리 공간을 차지하였습니다.구조체 flex의 마지막 멤버는 가변길이 배열(flexible arrays)으로서 동적할당으로부터 변수를 통해 크기를 할당받는다고 이해했습니다.Q1. 구조체 포인터를 선언할 때 struct flex* pf;라고 하는데, 이때 pf는 내부적으로 구조체 flex의 데이터들을 가리키는 것인지 궁금합니다.: 이 순간부터 pf는 구조체 flex와 관련이 있는것인가요? 관련이 있다면 어떤 것인가요?*지금까지 너무 자연스럽게 Q1-1처럼 struct 구조체Tag를 하나의 자료형으로만 생각해왔습니다.Q1-1. 단순히 struct flex라는 것은 하나로 묶어 (구조체를 다루는) 하나의 자료형으로 취급하는 것이 아닌가요?Q2. 스택 내에 구조체 flex에 대한 메모리 공간, 구조체 포인터 pf에 대한 메모리 공간 서로 따로 존재하며구조체 포인터 pf가 동적할당받은 메모리 주소를 가리킨다고 이해했습니다.*사진 첨부그런데 어떻게 구조체 포인터 pf를 통해 스택에 있는 구조체 멤버인 count와 average에 접근할 수 있는 것인지 잘 모르겠습니다.Q3. 구조체 flex의 멤버인 배열 values가 동적할당 메모리를 이용한 가변길이 배열로 설정하기 위함이라면동적할당을 받을 때, 배열이 필요로하는 n * sizeof(double)만 할당받아오면 됐을 것 같은데sizeof(struct flex)를 추가로 받아오는 이유가 궁금합니다.+구조체 포인터 pf를 통해 count와 average에 접근할 수 있던 것과 관련이 있을 것 같습니다.--------------------: 앞에서 말씀하셨듯 구조체 포인터 pf는 'flex라는 Tag를 갖는 구조체 변수'의 포인터'라고 하는데 Tag는 모든 멤버의 데이터를 담고있는 것인가요?구조체 멤버 또는 구조체 포인터가 선언됨에 따라 구조체의 멤버들은 메모리 공간을 할당받고구조체 포인터를 ->연산자를 통해 멤버에 접근할 수 있다는 것은 이해했습니다.(Q2)※다만 제가 여기서 궁금한 것은 구조체 포인터에 단순히 동적할당 받은 힙 메모리의 주소를 대입했음에도어째서 동적할당 메모리를 가리키는 포인터 pf를 통해 멤버에 접근이 가능한지..입니다.
- 미해결홍정모의 따라하며 배우는 C언어
(강의10:01) 런타임 에러 발생하는 이유
이정도까지만 작성한 후, 처음 엔터를 입력했을 때 정상적으로 반복문을 빠져나가 프로그램을 종료하는지 알아보기 위해 실행해보았습니다.컴파일 에러는 없었고 정상적으로 빌드되어 실행되었는데,왜 런타임 에러가 발생하는지 이유를 모르겠습니다.[수정] 코드를 전체 다 작성했음에도 똑같이 런타임 에러가 발생합니다..ㅠㅠ#define CRTSECURE_NO_WARNINGS#include <stdio.h>#include <limits.h>#define MAX_TITLE 40#define MAX_AUTHOR 40#define MAX_BOOK 3char* s_gets(char* st, int n){ char* ret_val; char* find; ret_val = fgets(st, n, stdin); if (ret_val) { find = strchr(st, '\n'); if (find) * find = '\0'; else while (getchar() != '\n') continue; } return ret_val;}struct book{ char title[CHAR_MAX]; char author[CHAR_MAX]; float price;};int main(){ struct book bk[MAX_BOOK] = {"Empty", "Empty", 0.0f}; int count = 0; int i; for (i = 0; i < MAX_BOOK; i++) { printf("Input a book title or press [Enter] to stop\n"); if (s_gets(bk[i].title, MAX_TITLE) == NULL) break; //EOF를 만나 NULL을 반환했을 때 (예외처리) if (bk[i].title[0] == '\0') break; printf("Input the author.\n"); s_gets(bk[i].author, MAX_AUTHOR); printf("Input the price.\n"); int flag = scanf("%f", &bk[i].price); while (getchar() != '\n') continue; //getchar() != '\n'는 입력 버퍼 내의 개행을 지우는 역할. 꺼내어서 비교? == 버퍼에서 소거 if (i == 2) printf("No more books.\n"); count++; } if (count > 0) { printf("\nThe list of books:\n"); for (i = 0; i < count; i++) printf("\%s\" written by %s: $%.1f\n", bk[i].title, bk[i].author, bk[i].price); } else printf("No books to show.\n"); return 0;}
- 미해결홍정모의 따라하며 배우는 C언어
C언어 자료구조
안녕하세요 강의 수강 중 문의드립니다. 비전공자로 C언어로 자료구조를 배우라는 말씀을 듣고 현재 수강중입니다. 파이썬이 어떤 언어인지까지만 배운 상태에서 C언어 수업을 들었습니다. 궁금한 점은, C언어를 통한 자료구조가 프로그램 개발에 있어 어떤 방식으로 도움이 되는건지 궁금하고, 또 제가 집중하여 이해해야할 부분을 알고 싶습니다. 수고하세요
- 미해결홍정모의 따라하며 배우는 C언어
배열, 포인터 주소 관련
#include <stdio.h> int main() { //배열의 이름은 배열의 첫번째 인덱스 주소 int arr1[] = { 101, 102, 103 }; int arr2[] = { 104, 105, 106 }; printf("%p, %p, %p\n", &arr1, arr1, &arr1[0]); int arr3[2][3] = { {1,2,3},{4,5,6} }; printf("%p, %p, %p\n\n", &arr3, arr3, &arr3[0]); //포인터의 이름은 할당된 주소 //&포인터는 포인터도 변수니까 그에 대한 주소(자료형에 관계 없이 메모리 주소 사이즈) int* prt = arr1; printf("%p, %p, %p\n", &prt, prt, arr1); int* parr[2] = {arr1[0],arr2[1]}; printf("%p, %p, %p\n", &parr, parr, arr1); return 0; }안녕하세요.10.14 강의 내용 질문은 아니지만 이 강의부터 진도를 못나가고 있어요 ㅠ'이름'에 대한 강조가 많아 혼란스러워 질문 드립니다.1.&배열이름($arr1)에서 배열 이름이 주소인데 앞에 &을 붙여 사용하는 경우도 있나요?사용할 경우 그냥 arr1과 같은 주소 나오는 건가요?2.포인터에서 &prt와 prt 차이는포인터도 변수니까 그에 대한 주소와포인터에 할당된 주소 차이로 봐도 될까요?3.그런데 포인터[] 배열에서는 &parr, parr의 주소 같게 나오는데 이유가 궁금합니다. 이 주소는 변수 주소인가요?늘 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
(10:57) 바이너리 함수의 데이터 내용
안녕하세요. 강의 13.5 10: 57 부근에 대한 질문입니다.교수님께서 강의를 진행하시는 대로 그대로 코드를 작성하고 실행하였으나, 0부터 144짜지 2의 간격으로 깔끔하게 출력되던 교수님의 결과창과 달리 제 출력 결과는 마치 주소값을 나타내듯 불규칙한 -값의 연속, 그리고 중간중간 0과 정수 등이 섞여있는 결과를 보여주었습니다.바이너리 파일이 2진 데이터 그대로의 파일이기 때문에, 파일 내부에 어떠한 값이 들어있을지는 출력해보기 전까지 모르고또 출력되더라도 다른 컴퓨터의 결과와 완전히 동일한 결과가 출력되지 않을 수 있는 것이 정상인가요?혹시 제가 코드를 잘못 작성했는지 비교해보았으나 그런 것 같지는 않습니다.
- 미해결홍정모의 따라하며 배우는 C언어
2:28초 질문입니다.
교수님이 입력하신 대로 그대로 입력하고 디버깅 해보면B 1 2 를 입력한 뒤에 c의 값은 공백이고 cols값은 3 rows 값은 3입니다. 왜 cols값과 rows값이 3인지 이해가 안됩니다.scanf함수와 getchar함수를 만났을 때 입력을 받을 때와 입력을 받지 않고 다음 라인으로 바로 건너 뛰는 경우도 있는데 왜 그런 걸까요?
- 미해결홍정모의 따라하며 배우는 C언어
(19:50) 동적할당 메모리 반납
강의 19:50부분입니다.동적할당 메모리는 힙으로부터 메모리를 할당받은 후, 다 사용을 했으면 그 할당받은 메모리를 꼬박꼬박 free( )로 반납해야한다고 이해했습니다.그런데 강의에서 교수님께서 말씀하시길, "free( )를 한, 동적할당 메모리를 가리키는 포인터 ptr이라도, 더이상 어떠한 동적할당 메모리도 가리키고 있지 않음을 표현하기 위해 NULL을 대입해주는 것이 좋다"라고 하셨습니다.1. 동적할당으로 240bytes를 할당받고나서,37번 문장 free(ptr);을 했음에도 다시 NULL로 가리키는 데이터가 없음을 확실히 나타내줘야 한다는 것이 물론 선택사항이긴 하지만힙(heap)에 할당받은 240bytes는 어딘가 아직 반납되지 않고 존재한다는 것인가요?
- 미해결홍정모의 따라하며 배우는 C언어
2:09초 디버깅 해보는데 도와주세요
Buffer값을 상상하면서 디버깅 해보고 있는데 어느 방식으로 동작하는지 모르겠습니다.입력 : A 3 3 Buffer : [' ', \n] c : 'A' rows : 3 cols : 3입력: B 1 2 Buffer : [\n, B, 1, 2, \n] c : ' ' rows : 3 cols : 3Buffer에서 ' ' 가져와서 c가 ' ' 것은 알겠지만rows와 cols 값이 3인지 이해가 안됩니다.입력 : Buffer : [B, 1, 2, \n] c : 'B' rows : 1 cols : 2왜 입력을 받지 않는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C언어
_getch() _getche() 함수 질문
_getch() 함수로 qwer 입력한 뒤 enter를 입력하면 커서가 q로 이동하는 이유를 모르겠어요. \n을 만났다면 줄 바꿈이 되어야 하는 게 아닌가요??#include <stdio.h> #include <conio.h> //windows int main() { char c; //버퍼사용안하고 한글자씩 입력받을 때 사용 //_getch() : 사용자가 무엇을 입력하고 있는지 콘솔에 표시안됨 //_getche() : 사용자가 무엇을 입력하고 있는지 보여주고 한글자입력할때마다 출력함 while ((c = _getch()) != '.') putchar(c); //콘솔에서 getchar() 한글자씩 입력받을때 //\n전까지 또는 Buffer가 가득 찰때까지 일단 Buffer에 전부 저장함 //putchar()는 Buffer에 저장된 값을 Buffer에 값이 없을 때 까지 Buffer의 값을 차례대로 출력함 //while ((c = getchar()) != '.') // putchar(c); return 0; }
- 미해결홍정모의 따라하며 배우는 C언어
Boolean을 만들어서 사용하는 이유가 뭐에요?
그냥 변수명을 int true = 1, false = 0;이라고 지어서 printf("True is %d\n",true); printf("False is %d\n", false);이렇게 출력하는거랑 똑같지 않나요?왜 사람들이 bool타입을 만들어서 사용하는건가요?
- 미해결홍정모의 따라하며 배우는 C언어
fabs() 사용 관련 질문이 있습니다.
본 강의에서 사용된 fabs() 말인데요.fabs()를 사용하지 않고그냥 while ((guess - PI) > 0.01)이라고 코드를 짜면왜 제대로 돌아가지 않는건가요?guess도 PI도 다 double로 선언되어 있으니까 두 변수를 뺀 값도 double 타입을 가져서 소수점 자리수가 상세하게 저장되지 않나요? 그래서 (guess - PI) > 0.001이 제대로 계산될 줄 알았는데, fabs를 사용하지 않으면 결과값이 제대로 출력되지 않네요...?
- 미해결홍정모의 따라하며 배우는 C언어
(강의 10:21) 배열의 이름 dest에 "Start something"을 대입하는 것이 안되는 이유
강의 10: 21부분입니다.교수님께서 61번째 문장 dest = "Start something"; //Error에서 에러가 발생한다고 말하셨는데, 어째서 에러가 발생하게 되는 것인지 잘 모르겠습니다.error C2106: '=': left operand must be l-value빌드를 실행해보면 왼쪽은 l-value로서 작동해야한다고 합니다.이미 공간(주소)을 할당받은 배열 dest가 있고,배열의 이름 dest, 즉 포인터에다가, (수정불가능한/읽기만 가능한 프로그램 코드에 있는) "Start something"이라는 문자열의 주소를 대입함으로서 그걸 수정(?)하려 시도했기에 에러가 발생하는걸까 싶기도 하고.. 머릿 속의 개념이 꼬여버렸습니다.※그치만 이것이 안되는 경우는,'포인터로 정의한 문자열이 있을 때 포인터를 통해 인덱싱하여 값을 수정하려고 했을 때" 문제가 발생하는 경우였습니다.이번 dest = "Start something"; //Error의 경우에 해당하진 않을 것 같습니다.
- 미해결홍정모의 따라하며 배우는 C언어
(11:00) 코드를 실행했을 때 이상한 결과가 막 출력됩니다.
11.5강의 11:00부분입니다.void custom_put(const char* str); //Only two linesint custom_put2(const char* str); //Add \n, return # of charactersint main(){/* Custom function */ custom_put("Just "); custom_put("Do it!"); printf("%d\n", custom_put2("12345")); return 0;}void custom_put(const char* str){ while (*str != '\n') //while(*str) putchar(*str++);}int custom_put2(const char* str){ int count = 0; while (*str) { putchar(*str++); count++; } putchar('\n'); return count;}교수님께서 작성하셨던 코드 그대로 다 입력을 했습니다.빌드를 실행하면 정상적으로 빌드가 되는데, 콘솔창에서 정말 이상한 값들만 자동으로 쫙 출력됩니다.이게 어떤 원인때문에, 이렇게 발생한 문제인지 알고 싶습니다.
- 미해결홍정모의 따라하며 배우는 C언어
scanf()
int sum = i + j; 를 scanf 해주기 전, 저 같은 경우는 i, j를 초기화 해준 바로 다음에 작성해줬는데 이 때 scanf를 통해 입력 받은 값의 합이 할당되는 것이 아닌 초기화 된 값의 합을 할당받는 것을 보았습니다. 코드를 사용하는 순서가 달라지면 왜 결과가 이렇게 변하나요?