묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 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 프로그래밍
stdio.h 내 puts 함수 구현을 직접 볼 수 있나요?
안녕하세요 널널한개발자님 강의 재밌게 보고 있는 1인 입니다ㅎㅎ강사님께서 구현코드는 디버깅 과정에서 보여지지 않는다고 하셨는데, 볼 수 있는 방법이 있을까요? 모든 프로그래밍 언어의 기본이 되는 언어라고 배웠는데 실제구현을 볼 수 없다는 게 제 수준에서는 의아합니다. 찾아보니 소스파일 외의 구현코드를 찾기가 어렵고 챗지피티도 명쾌한 대답을 주지 못해서 질문 남깁니다. 여러번 질문했는데 항상 잘 답변해주셔서 감사드립니다~
-
해결됨Windows 시스템 프로그래밍 - 기본
동기와 비동기
다중 코어 환경에서는 os가 스레드를 처리할때 동시성과 병렬성을 무조건 다써서 처리하나요? 친화력 조절을 안한다면..1번이 그렇다라면 코어가 4개(스레드 4개)인 컴퓨터에서하나의 프로세스에서 3개의 스레드가 추가로 실행되어 총 4개의 스레드가 존재할때 추가된 3개의 쓰레드가 각각 2초짜리 입력 요청을 하나의 파일에 요청한다고 할때cpu (idle~적당히)동기 : 최소 2초 ~ 최대 6초 (block)비동기 : 최소 2초 ~ 최대 6초가 맞을까요?이렇게 볼때 비동기가 동기보다 좋은 이유가 block 되지않고 코드를 더 실행하는것 하나 뿐인가요? 이후에 다른 작업들이 더 많아지면서 비동기가 빛을 발하게 되는건가요?
-
해결됨홍정모의 따라하며 배우는 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 프로그래밍
getchar와 scanf의 차이
char ch = 0;scanf_s("%c", &ch, 1);printf("%d", ch); char ch = 0;ch = getchar();printf("%d", ch); 여기서 scanf_s와 getchar의 차이가 뭔가요?
-
미해결혼자 공부하는 C 언어 저자에게 배우는 C 언어의 모든 것
맥으로수강
맥으로수강하기 괜찮을까요? 에어 m1입니다
-
미해결C 프로그래밍 - 입문부터 게임 개발까지
맥으로수강
맥으로 수강하기 괜찮을까요? 에어 m1입니다
-
해결됨독하게 되새기는 C 프로그래밍
비선형 자료구조
혹시 비선형 자료구조 강의를 만드실 생각이 있으신가요? 있으면 듣고 싶네요 ㅎㅎ
-
해결됨Windows 시스템 프로그래밍 - 기본
시스템 프로그래밍에서 c와 c++
시스템 프로그램 함수 매개변수에 NULL을 사용할때 c식으로 코딩하려면 NULL이고 c++식으로 코딩하면 nullptr로 써두는게 협업에서 도움이 되나요?시스템 프로그래밍이나 소켓프로그래밍에서 scanf와 printf문,char배열을 쓰는것보다 cout,cin,endl,string을 쓰는게 성능 차이가 많이 나나요?
-
해결됨독하게 시작하는 C 프로그래밍
memcpy 사용 후 free 함수 사용여부
memcpy 의 내부동작을 설명하실때 동적메모리할당 구문이 있었는대 이 부분은 free 로 안닫아줘도 괜찮은건가요??
-
해결됨홍정모의 따라하며 배우는 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를 만났는가 물어본다는 것인지저장된 개수 만큼 왔기 때문에에서 뭐가 저장된 개수 만큼 왔다는 것인지 잘 모르겠습니다. 지금까지의 강의 내용을 이해해보면전자와 후자는 같은 걸 말하는 것 같고뉘앙스만 보면 파일을 얼마나 읽어들였는지에 대한 진행도? 같은 느낌이 드는데정확하게 이게 뭔지 잘 모르겠습니다 항상 좋은 답변 정말 감사합니다.
-
해결됨홍정모의 따라하며 배우는 C언어
3:00쯤에 selctionSort함수를 이런식으로 작성해도 괜찮나요??
void selectionSort(char* arr[], int n){ for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (strcmp(arr[j], arr[i]) < 0) swap(&arr[i], &arr[j]); } }}
-
해결됨독하게 시작하는 C 프로그래밍
qsort 함수에 관한 질문입니다.
stdlib에서 제공하는 qsort 함수qsort(void base, size_t width, int(*compare)(const void* key, const void* element))에서 compare부분이 비교함수를 가리키는 함수 포인터라고 알고있습니다.그렇다면,qsort(aList, 5, sizeof(int), *myCompare); 같이 넣지 않고qsort(aList, 5, sizeof(int), myCompare); 처럼 넣는 이유가 뭔가요?