월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C언어
5분 경 질문
후위 증가 연산자 때문에 i가 2가 되는 건 알겠는데 i가 j에 대입?된다는데 그 부분이 잘 이해가 가지 않습니다
- 해결됨홍정모의 따라하며 배우는 C언어
setvbuf함수의 대하여
안녕하세요 잦은 질문을 드리네요 죄송합니다 궁금증이 많아서..선생님 강의 도중 setvbuf함수를 설명하실 때 _IONBF 이 모드를 인수로 넣으며 버퍼를 사용하지 않는다고 설명해주셨습니다.이 설명을 듣고 떠오른건 한창 입출력 함수 알려주실 때 구글에 검색해서 찾아보다가 windows에서만 쓰이는 conio.h라이브러리에 _getch(), _getche()란 함수가 있었습니다.그 함수가 버퍼를 통하지 않고 바로바로 입력과 동시에 처리를 했었는데 setvbuf함수가 그런 기능까지 구현할 수 있게 해주는 걸까요?
- 미해결홍정모의 따라하며 배우는 C언어
이중포인터를 안 써도 답이 똑같은 이유가 몰까요
이중 포인터가 아니라 밑에 포인터만 써도 그냥 포인터만 써도 답이 이중 포인터랑 똑같이 나오는 이유는 무엇일까요?? void swap(char* xp, char* yp) { char* temp = *xp; *xp = *yp; *yp = temp; }
- 해결됨홍정모의 따라하며 배우는 C언어
EOF와 바이너리 파일의 대하여.
EOF란?파일 대신 배열로 예를 들어보겠습니다.예를들어 int a[3]이 있다고 가정을 하면 [0]번 인덱스부터 [2]번 인덱스 까지 있을 것 입니다. 파일을 읽는 것 처럼 배열로 읽는다고 바꿔 생각해보면 [0]번 인덱스를 읽을 땐 배열(파일)의 끝이 아니니 거짓(0)을 리턴합니다. 이렇게 [2]번 인덱스까지는 배열의 끝이 아니니 거짓(0)을 리턴 합니다. 그러다가 [3]번 인덱스를 읽었을 땐 배열의 끝 이므로 참(1)을 반환합니다. 이러한 개념을 파일로 적용 해봤을 때 이해한게 맞을까요??바이너리 파일과 확장자요즘 소프트웨어가 다양하고 각 소프트웨어마다 확장자를 가지고 있습니다. 그리고 그 확장자를 불러오거나 저장할 수도 있습니다.이번 강의를 보고 느낀점은 결국 확장자 라는 개념은 그 소프트웨어의 확장자 임을 나타내기 위함이고각 소프트웨어의 확장자 파일을 읽어올 때나 저장(출력)할 때 소프트웨어 개발사가 미리 정해둔 어떤 데이터들의 형식, 구조, 순서 대로 저장을 하고. 그 저장된 확장자 파일을 불러올 때 앞 서 미리 정해둔 저장(출력) 틀에 따라 데이터들을 차례대로 가져와서 사용하는 개념일까요?
- 미해결홍정모의 따라하며 배우는 C언어
9.9 print_binary 다르게 함수를 짜봤습니다
#define CRTSECURE_NO_WARNINGS#include <stdio.h>void recursion(int num);int main(){ int num = 10; recursion(10);}void recursion(int num){ if (num == 0) return; else recursion(num/2); printf("%d", num % 2);} 혹시 이 함수도 맞는지 확인해 주실 수 있으신가요
- 미해결홍정모의 따라하며 배우는 C언어
실행 후 콘솔창이 보이지 않는 문제
안녕하세요. 따배씨 학습 중 콘솔창 관련하여 문제가 생겨 질문드립니다.ctrl + f5 눌러 실행하는데 이미지와 같이 정상 실행은 되나 콘솔창이 화면에 뜨지 않습니다.작업표시줄에 콘솔창이 실행된게 보이는데, 클릭하여도 화면에 나타나지 않습니다.제가 문제 해결을 위해 시도해본 방법은 아래와 같습니다.비주얼 스튜디오 다시 시작.컴퓨터 다시 시작.비주얼 스튜디오 삭제 후 재설치.위와 같은 방법을 통해서도 문제가 해결되지 않았습니다. 어떤 시점에서 문제가 생겼는지는 저도 잘모르겠습니다. 전날 학습 후 다음 날 이어 학습하려는데 이와 같은 문제가 생겼습니다. 관련해서 도움 부탁드립니다. 사용환경 비주얼 스튜디오 커뮤니티 2022Window 10 home
- 해결됨홍정모의 따라하며 배우는 C언어
10분 6초경 코드 질문
https://www.inflearn.com/questions/741606링크의 질문의 답변에서 어느정도 설명을 해주셨는데s_gets 함수가 NULL을 반환할 경우 break을 해주는거라고 하셨어요그런데 s_gets 함수가 NULL을 반환하는 경우가 오류 말고는 없지 않나요?어떤 문자를 입력하던 엔터를 입력하던 fgets 함수가 포인터는 반환하게 돼있잖아요그렇다는건 역시 오류가 생겼을 경우 break을 하기 위해서if 의 조건문으로 s_gets 함수의 반환값이 NULL인지 확인하는걸 추가해준 것 인가요?항상 좋은 답변 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
10분 48초 주소 10에 메모리 0 의 질문
왜 주소 10 에 메모리 0 이란건가요처음엔 아스키표에 i가 의미하는게 10이었나? 그래서 주소를 10이라고 하셨나 생각했는데 아니더라구요왜 주소 10 에 0값이 들어간다는건지 질문합니다.
- 미해결홍정모의 따라하며 배우는 C언어
함수의 프로토타입과 컴파일 환경
뒤의 포인터 강의를 듣고, 2차원 배열 기상청 정보 예제에서 함수를 통해 구현하려 하던 간단한 부분이 막혀서 질문드립니다.헤더 파일에 있는 기능은 stdio.h랑 YEARS, MONTHS 에 상수 정의한 것 말고는 없습니다. 제 질문은 다름이 아니라 x86과 x64 에서 돌릴 때마다 생기는 오류와 포인터로 설정한 argument와의 관련성입니다.parameter에는 str[]을 세팅해두었으니, argument 역시 동일하게 세팅해야 하는 것은 의심의 여지가 없는 사실이지만, "배열은 그 자체가 하나의 주소이니까, 포인터로도 취급할 수 있지 않을까?" 라는 호기심에 리다이렉션한 str(dereferencing한 값이라 하나요?)을 parameter로 넣어보았습니다. 그 결과 x64에서 컴파일 성공(결과도 성공적), x86에서는 컴파일이 실패하였습니다. 그러나 아무리 고민해봐도, 정보를 저장하는 체계가 4바이트에서 8바이트로 바뀌었다고 해서 위 사진처럼 char밖에 자료형이 없는 경우에도 양상이 달라진다는 것이 이해가 되지 않습니다 ㅠㅠ. 도움 부탁드립니다..!
- 해결됨홍정모의 따라하며 배우는 C언어
멀티 쓰레딩이란?
안녕하세요, 멀티 쓰레딩 강의를 보고 궁금점이 생겨 질문드립니다. 물론 여기서 완벽히 이해하고 갈 예정은 아닙니다. 추후 cpp강의까지 연계하여 공부할 것이기 때문에 제가 이해한 개념이 맞는지 궁금하여 질문 드립니다.멀티 쓰레딩이란?프로그램에서 원래 한가지 일 밖에 못하는데 멀티 쓰레딩 이라는 개념으로 여러가지 일을 동시에 해주는 것이 맞을까요?예를 들어서 계산기가 있고 계산기를 사용하여 답을 얻고자 하는 사람이 3명일 때 쓰레드가 하나 일 경우에는 한 사람씩 순서대로 계산기 사용해야 하지만 쓰레드가 3개일 경우엔 각 사람마다 각자의 계산기를 통해 동시에 계산할 수 있는 그런 느낌이려나요?더 나아가서 실시간 서버와 통신하는 게임 같은 경우에도 많은 유저가 서버에게 요청하는데 쓰레드가 하나일 경우엔 이걸 하나씩 처리하지만, 멀티 쓰레딩을 사용하면 여러 개 처리하는 느낌일까요?메인 쓰레드와 쓰레드 생성강의에서 쓰레드라는 개념으로 보여주신 그림입니다. 위 그림을 통해 이해했던 개념이 프로그램에는 메인 쓰레드가 있고 메인 쓰레드가 처리해야 할 일이 많을 경우 자신을 복제하여 분신을 만들고(쓰레드 생성) 분신(쓰레드)에게 일을 할당하여 일을 시키고 프로그램이 끝나기 전 메인 쓰레드는 자신의 분신(쓰레드)과 다시 합체한다음 프로그램이 종료되는 느낌일까요? 이 과정에서 아직 분신(쓰레드)가 할당한 일을 하고 있다면 기달렸다가, 합체하고 종료되는 건가요?멀티 쓰레딩의 큰 개념은 결국 하나?강의 중 c언어 표준에는 멀티 쓰레딩이라는게 없어서 운영체제에서 제공하는 api을 통해서 멀티 쓰레딩을 할 수 있다고 하셨는데요, 그러시면서 윈도우에서 멀티 쓰레딩을 사용하는 방법과 gcc컴파일러에서 멀티 쓰레딩 사용하는 방법에 대해서 보여주셨는데 윈도우에서는 windows.h헤더파일과 쓰레드에 사용되는 전용 함수를 사용하셨고gcc컴파일러에선 pthread.h헤더파일과 쓰레드에 사용되는 전용 함수를 사용하셔서 구현을 해주셨는데요운영체제 api마다 c언어에서 멀티 쓰레드의 대한 제공하는 헤더파일과 함수, 문법과 표현법이 모두 달라서 이번 예제에서 조차 윈도우와 gcc컴파일러에서 작성한 방법이 달랐지만 결국 큰 틀은 쓰레드를 생성하고 쓰레드에게 할 일을 배정하고 프로그램이 끝나기 전 쓰레드들을 다시 하나로 합치는 이 과정은 어느 환경이든 다 똑같은 개념일까요?여담으로 멀티 쓰레딩과 표준에 대하여C언어 표준에는 멀티 쓰레딩이 없다고 하셔서 각 운영체제마다 다른 기술을 사용해서 구현해야 하는데 CPP언어 표준에는 멀티 쓰레딩이 있나요?? 항상 친절한 답변 남겨주셔서 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
x64 환경에서는 에러가 뜹니다
32 비트 환경에서는 결과가 무사히 잘 나오지만, x64로만 가면 다음과 같은 작은 창이 뜨면서 런타임 에러가 납니다.
- 해결됨홍정모의 따라하며 배우는 C언어
전역 변수 초기화와 값 대입 질문
전역 변수를 사용할 때int x;int y = x;x = y;이렇게 파일 스코프에서 rvalue에 변수가 들어가는건 안되는데void func(){x = y;}이렇게 블록 스코프에서 rvalue에 변수가 들어가는건 되는 이유가 뭔가요?
- 해결됨홍정모의 따라하며 배우는 C언어
8분 12초 10분 55초 질문 있습니당
8분 12초와 10분 55초에서*pt와 arr[0] 둘 다 식별자는 아니지만 표현식을 통해서 메모리 공간에 접근하는 것인데*pt는 오브젝트를 가리킨다고 표현하고arr[0]은 오브젝트라고 표현하는게 이해가 잘 안되요그러니까 arr[0]이 표현식이라는건 납득이 되는데 오브젝트라는건 납득이 안되요변수 이름으로 메모리 공간에 접근하는 걸로 변수 이름을 오브젝트라고 하지 않는 것 처럼표현식으로 메모리 공간에 접근하는 걸로 표현식을 오브젝트라고 표현하면 안되는 것 아닌가요?실제로 *pt는 표현식이지만 메모리 공간에 접근한다고 해서 오브젝트라고 부르지 않잖아요 항상 좋은 답변 정말 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
지역변수의 지속기간에 대한 궁금증
안녕하세요, 문뜩 지역변수의 지속기간에 대한 궁금증이 생겼습니다. 집중해서 강의들을 봤었는데 놓친부분이 있는건지 개념을 까먹은건지 헷갈리는 부분이 있습니다.궁금한 부분이 위 사진인데요 분명 지역변수의 영역은 {}블록 범위라고 하셨습니다. 안쪽 {}영역 안에 생성한 지역변수 i는 영역밖을 나오면 스택에서 사라진다고 들었습니다.그래서 바깥 영역에서 포인터변수를 만들고 안쪽영역에 변수i를 생성한 뒤 포인터변수에 주소를 넣고 바깥 영역에서 값을 대입도 해보고 출력도 해본 결과 영역을 벗어나서 사라졌다고 생각한 변수 i의 메모리 주소도 잘 출력이 되고, 대입한 결과도 제대로 출력이 되었습니다. 이런 경우는 어떤 경우인지 궁금합니다. 물론 바깥 영역에서는 변수 i의 값을 직접 수정하지 못하고 포인터 변수를 통해 수정이 가능하고 문법적으로 별로 안좋아 보이기도 한 것 같은데 저런 현상이 메모리에서 어떤식으로 되는건지 궁금합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
문자열 포인터와 문자열 배열의 대한 질문
안녕하세요. 11강에서 질문을 드려야 했는데 이번 강의를 보고 한번 정리하고 가고자 질문을 드리게 되었습니다.질문을 좀 더 자세하게 하기 위해 메모리 레이아웃 사진첨부를 하였습니다.const char* str = “Constant string”; // str is a modifiable lvalue. str = “Second string”; // “Constant string” = “Second String” // imposible str[0] = ‘A’; //Error char str2[] = “String in an array”; str2[0] = ‘A’; // OK이번 강의에서 나온 코드를 가지고 개념 정리를 하고 싶습니다.코드에 쓰인 문자열은 어디에 저장이 되는가?이번 강의에서 쓰인 문자열 포인터char* str = “Constant string”str = “Second string”그리고 문자열 배열char str2[] = “String in an array”여기에 쓰인 모든 문자열 “Constant string”, “Second string”, “String in an array” 은 TEXT Segment 즉 프로그램 코드에 저장이 되는 걸로 알고있습니다. 맞을까요?문자열 포인터와 문자열 배열의 차이문자열 포인터는 TEXT Segment에 저장되어 있는 문자열의 메모리 주소를 가리키는 것이다. 즉 읽기 전용에 저장되어 있기 때문에 str[0] = 'A'와 같이 수정하려 하면 OS에서 막는다.이걸 VS에서 디버깅으로 확인을 해보았습니다.먼저 const char* str = “Constant string”;을 확인 해보았습니다. str 포인터 변수가 가리키고 있는 메모리 주소를 메모리에서 찾아 보았습니다.검색을 해보니 문자열의 시작 문자 'C'의 메모리 주소를 가리키고 있으며 문자열의 끝인 g 다음엔 \0이 붙어있는 걸 확인할 수 있었습니다.여기서 str = “Second string”; 구문을 만난다면str 포인터 변수가 가리키고 있는 메모리 주소가 문자열의 시작 문자'S'의 메모리 주소를 가리키고 있는걸 확인하였습니다. 그리고 문자열의 끝인 g옆에는 \0이 붙어있는걸 확인할 수 있었습니다. 그럼 여기서 문자열 배열은 어떤 식이냐일단 문자열 포인터와 문자열 배열에서 사용한 문자열들은 TEXT Segment에 저장이 되어있기 때문에 메모리에서 보면 사용한 문자열들이 나란히 있는 걸 확인할 수 있었습니다. 하지만 디버깅을 통해 현재 문자열 배열인 str2[]의 메모리 주소를 보면 인걸 확인할 수 있었습니다. 분명 저 문자열이 저장되어 있는 메모리 주소 : 0x00007FF648499C10 이랑 전혀 틀린 주소입니다. 검색해보면 똑같은 문자열이 해당 메모리 주소에도 있는걸 확인하였습니다. 위와 같은 내용을 통해 알수 있었던 것은 프로그램 만들때 사용한 모든 문자열은 TEXT Segment(읽기전용)에 저장이 되며 문자열 포인터는 TEXT Segment에 있는 "문자"의 메모리 주소를 가리키는 것이며 문자열 배열은 스택이라는 (읽기, 쓰기전용)메모리 공간을 할당받고 TEXT Segment에서 문자열들을 복사해오기 때문에 str2[0] = 'B' 같은 수정이 가능한 것이다. 라고 이해를 하였는데 제대로 이해한게 맞을까요? 마지막으로 문자열 포인터를 사용하는 이유?마지막 질문은 제가 생각을 해보았습니다. 수정도 못하는 문자열 포인터는 왜 사용할까? 생각을 해보았는데 프로그램을 보면 분명 수정이 필요없는 고정된 문자열들을 본적이 있습니다.그런것들을 사용할 때 불필요하게 TEXT Segment에 저장이 되었다가 스택 메모리를 할당 받고 데이터를 "복사"해서 사용하면 메모리 낭비가 일어나고 어떤 행위를 하는 것 이기 때문에 불필요한 과정을 하기 때문에 이런 것들은 그냥 TEXT Segment에 저장 되어있는 문자열의 주소를 가리켜서 사용하면 메모리 절약을 할 수 있는 관점에서 사용하는 것 일까요?
- 해결됨홍정모의 따라하며 배우는 C언어
구현과 삼항연산자의 대한 질문.
#include <stdio.h> void swap(int* xp, int* yp); void printArray(int arr[], int size); void selectionSort(int arr[], int n); int main() { int arr[] = { 64, 25, 12, 22, 11,}; int n = sizeof(arr) / sizeof(arr[0]); selectionSort(arr, n); printArray(arr, n); return 0; } void printArray(int arr[], int size) { for (int i = 0; i < size; i++) printf("%d\n", arr[i]); } void swap(int* xp, int* yp) { int tmp = *xp; *xp = *yp; *yp = tmp; } void selectionSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int* min_idx = &arr[i]; for (int j = i + 1; j < n; j++) { min_idx = (*min_idx < arr[j]) ? min_idx : &arr[j]; } swap( min_idx, &arr[i]); } }선생님의 빈 칸 맞추기를 공개하시기 전에 문제를 생각하여 풀어봤습니다. 여러 숫자를 집어넣어봐도 잘되는 것 같습니다. 이 코드가 문제없이 잘 작동하는 코드일까요?그리고 여기서 삼항연산자를 썼는데 삼항연산자가 자주 쓰이는 연산자 인가요?
- 해결됨홍정모의 따라하며 배우는 C언어
함수와 재귀함수(1)이 가지는 반환값
#include <stdio.h>int start;int loop(int n);long recursive_factorial(int);int main(){ int b = recursive_factorial(5); printf("your final destination is % d", b); return 0;}long recursive_factorial(int n){ if (n != 0) { // recursion 함수 : it is called "재귀호출" and tail recurision in englishprintf("%d\n", n); return n * recursive_factorial(n - 1); } printf("hki"); // 이 줄 없을때는 그냥 120 출력된다. 그러나 이 줄 추가했더니 뭔가 다르다. //출력스트링의 길이가 반환값인가? hi 일때 최종값 240, hki일때 최종값 360이네(120씩 증가한다.), 근데 한글은 길이 한 번 늘때마다 240씩 증가하네? } 코드입니다.팩토리얼 예제를 얼떨결에 직접 풀었지만, 궁금증이 가시지 않아 질문 올립니다.첫 번째, recursive_factorial(2)는 2 * 동일한 함수의 (1)을 반환값으로 갖습니다. 이때 함수(1)의 반환값은 어찌 되나요?두 번째, 주석으로 남겨둔 내용의 이유가 궁금합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
2분 5초경 5분 37초경 질문있습니다.
5분 37초 ch = fgetc(fp);로 버퍼에 문자들을 채우고 거기서 1글자를 가져오고 for (int i = 0; i < sizeof(buffer); ++i) printf("%c", buffer[i]);printf("\n");로 버퍼에 있는 내용들을 전부 출력해보면 fgetc() 함수로 가져온 문자를 포함해모든 문자가 출력되는 걸 볼 수 있는데 제가 알기로는 버퍼에 있는 내용을 복사를 하면 복사를 한 내용이 버퍼에서는지워지는 걸로 알고 있는데 그렇다면 버퍼에서 먼저 fgetc() 함수로 가져온 문자가지워져서 버퍼의 내용들을 출력할 때 그 문자는 제외되어야 하는 것 아닌가요?제가 버퍼에 대해 잘못 이해하고 있는 건가요?
- 해결됨홍정모의 따라하며 배우는 C언어
5분 44초경 질문있습니다.
fsetpos() 함수가 어떻게 작동하는지 이해가 잘 안돼서 fpos_t pt;pt = 10;fsetpos(fp, &pt);ch = fgetc(fp);printf("%d %c\n", ch, ch);fgetpos(fp, &pt);printf("%lld\n", pt); 위의 코드 다음에 fsetpos(fp, &pt);ch = fgetc(fp);printf("%d %c\n", ch, ch);fgetpos(fp, &pt);printf("%lld\n", pt); 이런 식으로 코드의 일부분을 추가로 복사 붙여넣기하여 실행하면 어떻게 될지 궁금해서 실행을 해봤더니이런 결과가 나왔습니다.실행하기 전에 결과를 예상해봤는데똑같이 K가 출력되거나 K의 다음칸에서 10칸만큼 더 이동을 해서 V가 출력될 줄 알았습니다그런데 제 예상과는 완전 다른 결과가 나와버렸네요아마 읽고나면 한 칸 이동을 하는 특성 때문에 그렇게 되는 거 같은데그게 어떻게 작동하길레 저런 결과가 나오는지 궁금합니다. 항상 좋은 답변 정말 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
8분 8초경 질문
8분 8초에서feof() 함수는 EOF를 만났는가 물어봐요라고 하시고 8분 16초에서근데 지금 깔끔하게 저장된 개수만큼 왔기 때문에 EOF를 만나지 않은 상태에요라고 하시는데 EOF를 만났는가 물어본다는 말에서 어떤게 EOF를 만났는가 물어본다는 것인지저장된 개수 만큼 왔기 때문에에서 뭐가 저장된 개수 만큼 왔다는 것인지 잘 모르겠습니다. 지금까지의 강의 내용을 이해해보면전자와 후자는 같은 걸 말하는 것 같고뉘앙스만 보면 파일을 얼마나 읽어들였는지에 대한 진행도? 같은 느낌이 드는데정확하게 이게 뭔지 잘 모르겠습니다 항상 좋은 답변 정말 감사합니다.