묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결문제로 배우는 C언어
배열을 전역변수로 설정하는 이유
타 강의에서 전역변수는 최대한 사용을 지양하는게 좋다고 들은 기억이 있는데, 해당 강의에서 배열을 전역변수로 사용하는 이유가 있나요??선생님께서 다른 질문글에 답변해주신<배열을 main 함수 밖에 전역으로 선언하면 메모리의 데이터 영역에 할당되며 메모리의 크기가 여유롭게 잡힙니다. 하지만 main 안에 지역변수로 선언하면 메모리의 스택영역에 할당되며 크기가 작아 여유공간이 없습니다. >이 내용과 관련이 있는걸까요?
-
미해결문제로 배우는 C언어
41. A를 #으로에서 질문 있습니다.
풀이를 보기 전에는 string.h의 존재를 몰라서 아래처럼 작성했었습니다.#include<stdio.h> int main() { int i; char word[100]; scanf("%s", word); for (i = 0; i < 100; i++) { if (word[i] == 'A') word[i] = '#'; if (word[i] == NULL) break; } printf("%s", word);여기서 궁금한 것은 for문 속 두번째 줄의 의도가 for문에서 쓸데없이 계속 돌지 않게 하기 위한 것인데, 맞게 반영 된건지 궁금합니다.그러니까 word를 APPLE로 입력했을 때 for문 속에서 i = 5일 때 break가 제대로 작동 되는지 궁금합니다!
-
미해결C언어 슈팅게임 따라만들기
콘솔창 크기 바꿀때 윈도우11에서 속성창이 안보입니다. ㅠㅠ
저 선생님 여기 콘솔창 크기 바꿀때 제 컴퓨터가 지금 윈도우 11이라 그런데.. 속성창이 안보입니다.. 어떻게 해야할까요?..
-
미해결홍정모의 따라하며 배우는 C언어 (부록)
이진 탐색: 탐색 실패하는 경우 어째서 first > last인 경우가 나오나요?
17.15강 이진탐색 강의의 13:10부분입니다.이진탐색에서 만약 탐색을 실패하는 경우 어째서 first >last라는 상황이 발생하는지 잘 모르겠습니다.반복문을 반복해야할 상황이(탐색해야할 상황이) first <= last인 상황이라는 것을 알겠지만, first > last가 되는 상황은 어떻게 유도되는지 모르겠습니다.#include <stdio.h> int BSearch(int ar[], int len, int target) { int first = 0; int last = len - 1; int mid; while (first <= last) { mid = (first + last) / 2; if (target == ar[mid]) return mid; else { if (target < ar[mid]) last = mid - 1; else first = mid + 1; } } return -1; } int main(void) { int arr[] = { 1,3,5,6,7,9,11,13,15,19 }; int index; index = BSearch(arr, sizeof(arr) / sizeof(int), 3); if (index == -1) printf("해당값 없음\n"); else printf("타겟의 위치 : %d\n", index); return 0; }
-
미해결홍정모의 따라하며 배우는 C언어
입력받는 함수 사용할때 디버거
예제 그대로 따라하고 실행하면서hello nice to meet youmy name isi love you.라고 입력했을땐 '.' 이 나올때까지 한번에 입력받는데디버거로 확인해 보려할땐한 줄씩 한줄씩 while문을 다 돌리고 나서 입력을 받더라고요.보기엔 한번에 입력받는 것 처럼 보이지만 사실은 줄바꿈이 입력될때마다 한줄씩 끊어서 입력을 받는 건가요??
-
미해결홍정모의 따라하며 배우는 C언어
메모리 레이아웃에서 스트림의 위치
fopen이 반환하는것은 파일구조체의 포인터입니다.이러한 fopen이 반환하는 파일구조체는 메모리 레이아웃에서 어디에 위치하고 있나요?fopen함수를 사용하면 생기는 파일 구조체를 파일스트림 이라고 이해하면 될까요?그리고 fclose를 사용하는 이유는, 파일이 다 읽히지 않았을 때 버퍼에 남아있는 데이터가 오류를 일으키지 않게 하기 위함이라고 하셨습니다. 그 이유 외에 메모리 누수를 방지하기 위함도 있나요?
-
미해결홍정모의 따라하며 배우는 C언어
질문! int와 main(), 그리고 return에 대해서
안녕하세요 c언어를 공부 중 인 학생입니다.일단 int main()은 '메인 함수가 프로그램 종료 시 return값을 정수형 으로 반환 받겠다.' 의 의미 인 건 알겠습니다. 그래서 main함수 앞에 정수형인 int 가 붙는 것 이고요. 그런데 여기서 return값에 대해 궁금한게 프로그램을 성공적으로 종료 시켰다 라는 의미로 값 0을 반환 하는데 굳이 반환 값이 꼭 0 이여야 하나 궁금합니다. 0이 아니여도 1, 4, 5, 7, 같은 다른 정수를 반환 시켜도 프로그램은 정상적으로 작동 하는 거 같은데 0과 다른 정수들의 차이점을 모르겠습니다. int main() 함수에서 return 값을 반환 시킬때 꼭 0을 쓰는 이유가 있나요?
-
해결됨독하게 되새기는 C 프로그래밍
함수호출규약 중에서 fastcall 관련 질문 드립니다!
fastcall이라는 규약이 메모리에 매개변수를 저장하는 것이 아니라, 레지스터 쪽에 매개변수를 저장해서, 메모리에 매개변수를 다시 저장할 필요가 없도록 만들기 때문에 속도가 빨라진다는 것으로 이해를 했습니다! 그런데, 제가 메모리를 찾아보니까 수업 중에서 예제로 드셨던 add 함수의 매개변수 param1, param2가 메모리에서 똑같이 잡혔는데, 이건 어떻게 이해하면 좋을까요? 디스어셈블리로 확인해보니까 ECX, EDX 레지스터에 각각 param값들이 저장이 잘 되는 것은 확인을 했는데, 상황이 그렇다면 fastcall인 경우 레지스터에만 값이 들어가면 될 것 같은데, 이게 똑같이 메모리에서 매개변수의 주소가 잡힌다는 것이 약간 의아합니다!
-
미해결C 프로그래밍 - 입문부터 게임 개발까지
빌드오류가 있다고 나오고, 지정된 파일을 찾을 수 없다고 오류가 나옵니다..
#include<stdio.h>#include<time.h>#include<stdlib.h>/*10마리의 서로다른 동물 (각 카드 2장씩)사용자로부터 2개의 입력값을 받아서 -> 같은 동물 찾으면 카드 뒤집기모든 동물 쌍을 찾으면 게임 종료총 실패 횟수 알려주기*/int checkAnimal[4][5]; //뒤집혔는지 여부 확인int arrayAnimal[4][5]; //카드 20장 - 4x5const char* strAnimal[10]; //10개의 배열 => 캐릭터포인터void initAnimalArray(); // 카드 배치void initAnimalName(); // 동물 종류void shuffleAnimal(); //카드 섞기int getEmptyPosition(); //빈 공간 찾기int conv_pos_x(int x);int conv_pos_y(int y);void printAnimals(); //동물 위치 출력void printQuestion(); // 문제 출력 (카드지도)int foundAllAnimals();int main(void){ srand(time(NULL)); initAnimalArray(); initAnimalName(); shuffleAnimal(); int failCount = 0; //실패 횟수 while (1) { int select1 = 0; //사용자가 선택한 처음 수 int select2 = 0; //사용자가 선택한 두번째 수 printAnimals(); //동물 위치 출력 printQuestion(); // 문제 출력 (카드지도) printf("뒤집을 카드 2개를 고르세요 : "); scanf_s("%d %d", &select1, &select2); if (select1 == select2) // 같은 카드 선택 시 무효 continue; //좌표에 해당하는 카드를 뒤집어보고 같은지 안같은지 확인 int firstSelect_x = conv_pos_x(select1); int firstSelect_y = conv_pos_y(select1); int secondSelect_x = conv_pos_x(select2); int secondSelect_y = conv_pos_y(select2); //정수좌표를 x,y로 변환 if (checkAnimal[firstSelect_x][firstSelect_y] == 0 && checkAnimal[secondSelect_x][secondSelect_y] == 0//카드가 뒤집히지 않앗는지 && arrayAnimal[firstSelect_x][firstSelect_y] == arrayAnimal[secondSelect_x][secondSelect_y])//두 동물이 같은지) { printf("\n\n빙고!! : %s 발견!!\n\n",strAnimal[arrayAnimal[firstSelect_x][firstSelect_y]]); checkAnimal[firstSelect_x][firstSelect_y] = 1; checkAnimal[secondSelect_x][secondSelect_y] = 1; } //다른 동물일 경우 else { printf("\n\n땡!!(틀렸습니다.. 혹은 이미 뒤집힌 카드입니다.)\n\n"); printf("%d : %s\n", select1, strAnimal[arrayAnimal[firstSelect_x][firstSelect_y]]); printf("%d : %s\n", select2, strAnimal[arrayAnimal[secondSelect_x][secondSelect_y]]); //틀린카드 알려주기 printf("\n\n"); failCount++; //실패횟수 +1 } //모든 동물을 찾았는지 여부. 1:참 , 0:거짓 if (foundAllAnimals() == 1) { printf("***축하합니다!총 %d번의 시도끝에 모든 동물을 다 찾았네요***\n",failCount); break; } } return 0;}void initAnimalArray(){ for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { arrayAnimal[i][j] = -1; } }}void initAnimalName(){ strAnimal[0] = "강아지"; strAnimal[1] = "고양이"; strAnimal[2] = "토끼"; strAnimal[3] = "다람쥐"; strAnimal[4] = "햄스터"; strAnimal[5] = "청설모"; strAnimal[6] = "오리"; strAnimal[7] = "원숭이"; strAnimal[8] = "미어캣"; strAnimal[9] = "호랑이";}void shuffleAnimal(){ for(int i = 0; i<10; i++) { for (int j = 0; j < 2; j++) { int pos = getEmptyPosition(); int x = conv_pos_x(pos); int y = conv_pos_y(pos); arrayAnimal[x][y] = i; } }}int getEmptyPosition(){ while (1) { int randPos = rand() % 20; //0-19사이의 랜덤 숫자 반환 int x = conv_pos_x(randPos); int y = conv_pos_y(randPos); if (arrayAnimal[x][y] == -1) //초기에 -1로 설정했기때문에 -1이면 비어있다는 뜻 { return randPos; //현재 위치 반환 } } return 0;}int conv_pos_x(int x) //5로 나눴을 때 몫 /{ return x / 5;}int conv_pos_y(int y) //5로 나눴을 때 나머지 %{ return y % 5;}void printAnimals() //동물 위치 출력{ printf("\n=====이건 비밀인데 몰래 보여드려요=====\n"); for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { printf("%8s", strAnimal[arrayAnimal[i][j]]); } printf("\n"); } printf("\n=========================================\n");}void printQuestion() // 문제 출력 (카드지도){ printf("\n\n(문제)\n"); int seq = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { //카드를 뒤집어서 정답을 맞혔으면 '동물이름 if (checkAnimal[i][j] != 0) { printf("% 8s", strAnimal[arrayAnimal[i][j]]); } //아직 뒤집지 못했으면 (정답을 못맞혔으면) -> 뒷면 -> 위치를 나타내는 숫자 else { printf("%8d", seq++); } } printf("\n"); }}int foundAllAnimals(){ for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { if (checkAnimal[i][j] == 0) { return 0; } } } return 1;//모두 다 찾음}
-
미해결홍정모의 따라하며 배우는 C언어
컴파일 및 함수 관련 질문
안녕하세요. 컴파일 과정과 관련하여 잘 이해가 되지 않은 부분이 있어서 질문 드립니다. <질문1> 컴파일 관련 질문1) 컴파일 작업 중 전처리 단계에서는 include한 헤더파일의 내용 즉, 헤더파일에 저장된 함수 선언 부분을 소스파일로 복사붙여넣기 하는 과정이고, 헤더파일은 일반적은 함수의 선언만 되어 있기 때문에 함수가 호출될 때는 함수의 body가 있는 다른 실행파일과 연결하는 '링킹'과정이 필요하다. 라고 이해하였는데 제대로 이해하였나요? 즉, 전처리 단계는 함수를 선언하는 과정이라면, 함수 호출이 될 때, 함수의 body부분을 알 수 있고, 제대로 body 부분을 파악하기 위해서 '링킹'이 제대로 되는 것이 중요하다고 이해했습니다! 2) inline함수는 위의 일반적인 함수 호출과 달리, 주소에 접근하여 함수의 코드를 가져오는 것이 아니라 단순히 헤더파일에 있는 함수의 코드를 복사하여 main함수에 붙여넣는 구조인 것인가요? 그렇다면, 일반적인 함수 호출보다 상대적으로 더 빠르다고 볼 수 있을까요? 또한, inline함수는 함수의 주소를 모른다고 했는데, 그 이유가 무엇인지도 궁금합니다. <질문2> 함수 관련 질문함수 또한 포인터이기 때문에 함수가 호출되면, 함수가 가리키고 있는 주소에 접근하여 함수의 실행 코드를 실행한다고 하셨습니다. 예를 들어 sum함수를 호출한다고 할 때, a,b를 함수의 인자로 받게 되면, 변수 a,b를 통해서 접근할 수 있는 메모리에 들어있는 '값'과 함수 호출 종료 후 돌아올 주소값이 함수 실행 파일의 스택에 쌓이게 되고, 함수 실행 코드에서의 지역변수들이 그 위에 쌓이면서 스택 프레임이 생성되는 것인가요? 이러한 스택 프레임을 활용하여 code segment에 있는 함수 코드들이 실행되는 것인가요? 감사합니다!!!
-
미해결문제로 배우는 C언어
20번 소수 판별하기에서 질문 있습니다.
3:14부터 설명하시는 내용에 대해서 질문 있습니다. 다른 부분은 예외로 치고 반복문에서만 봤을 때,반복문이 최대한 조금 돌아가게 만드는 게 효율성이 높고 좋은 코드라고 볼 수 있는건가요?? 그런 의미에서 21번 최대공약수 문제에서 for (i = 1; i <= a && i <= b; i++) { if (a % i == 0 && b % i == 0) max = i; } printf("%d", max);이렇게 작성하였는데 코드를 최대한 간결하게 작성하는 것에 중점을 두었습니다. 그런데 의문인 점이a, b 중 작은 값이 30이라면 반복문이 무조건 30번 돌아가기 때문에 선생님께서 작성하신 코드에 비해 비효율적이고 안좋은 코드라고 볼 수 있을까요?그렇다면 앞으로 반복문이 들어가는 코드를 작성 할 때 반복횟수를 고려하면서 작성하는 게 좋은 습관을 만드는 길인걸까요? 아니면 이렇게까지 신경 쓸 필요는 없나요? 궁금합니다!
-
미해결홍정모의 따라하며 배우는 C언어
포인터의 배열
int arr0[3] = {1, 2, 3};int arr1[3] = {4,5,6};int* parr[2] = {arr0,arr1}와 같이 포인터의 배열을 선언해준다는 가정 하에 이때 parr자체는 arr0[0]을 가리키는 것이 맞나요??
-
해결됨홍정모의 따라하며 배우는 C언어
초반 실습 오류
안녕하세요.몇 번이고 다시 실습 코드를 쳐봤지만 같은 오류가 생깁니다.원인이 무엇인지 구글링을 해봐도 잘 모르겠습니다.늘 좋은 강의 감사합니다.
-
미해결홍정모의 따라하며 배우는 C언어
포인터와 배열
안녕하세요!! 설명해주신 포인터와 배열 개념을 이해하는 도중 혼동이 와 질문을 남깁니다. double nums[1.0,2.0,3.0,4.0];와 같이 배열을 선언한 뒤 double *ptr = nums와 같이 포인터 변수에 nums를 넣어주는 상황으로 가정해보겠습니다. const를 배열이나 포인터 앞에 붙이면 배열의 요소들을 변경할 수 없지만 ptr++과 같이 증감연산자는 사용이 가능하다고 설명을 해주신 부분에서 ptr++을 하면 그 값은 nums[1]이 되는 것은 이해가 갑니다. 하지만 ptr++을 해주고 난 뒤 ptr[2]를 하면 nums[3]의 값이 출력된다고 하셨습니다. 저는 ptr++이라는 값이 nums[1]을 가리키는 것은 히해했지만 ptr[2]라는 값이 왜 nums[2]가 아닌 nums[3]을 가리키는지 모르겠습니다. nums ptr 포인터 변수 자체가 ptr++을 해주게 되면 nums[1]이라는 값으로 초기화가 되고 인덱싱을 하려면 기존의 nums[0]이 nums[1]과 같은 위치가 되는 것인가요??
-
미해결홍정모의 따라하며 배우는 C언어
구조체 관련 질문
안녕하세요. 잘 이해가 되지 않은 부분이 있어서 질문 드립니다.<질문1>struct my_class{char* name;int score;} int main(){struct my_class student; student.name = (char*)malloc(sizeof(char) * 20 + 1);student.score == (int*)malloc(sizeof(int));scanf("%s %d", student.name, student.score) 이전에 구조체.멤버는 '주소'를 의미한다고 답변해주셨습니다. 근데 잘 이해가 되지 않은 부분이위의 코드처럼 score에 대한 값을 받아올 때는 주소연산자(&)을 사용하지 않으면, 오류가 발생합니다. 구조체. 멤버가 배열의 경우에는 '주소'를 의미하고, 변수나 상수 등을 의미할 때는 '값'을 지칭한다고 이해해도 될까요? <질문2>구조체에서 문자열을 가진 변수를 선언할 때, 포인터보다 배열을 선호 한다고 하셨는데 그 이유가 정확하게 이해가 되지 않아서 질문 드립니다.1)포인터를 사용하게 되면, 포인터도 메모리를 차지하고, 동적할당 받은 메모리 영역도 있기 때문에 배열을 사용했을 경우보다 메모리 측면에서 비효율적이기 때문에 배열을 선호한다고 이해하면 될까요? 2)소스코드에 직접 문자열을 입력하는 경우에는 해당 문자열이 메모리레이아웃의 text segment에 저장되어, 읽기 전용 모드이기 때문에 수정을 할 수 없다. 하지만, 할당 받은 메모리에 직접 입력을 받는 경우에는 힙 영역에 해당 데이터가 저장되기 때문에 수정 등이 가능하다. 라고 이해했는데 제대로 이해한 것인지 궁금합니다. 즉, <질문1>의 예시 코드처럼 name에 대한 메모리를 할당 받았을 때, 콘솔창에서 입력 받은 값은 힙 영역에 저장되고, 구조체 변수 student는 스택에 저장되어 힙에 할당된 name이 할당 받은 메모리를 가리키고 있는 것이 맞는지 궁금합니다! 감사합니다.
-
미해결홍정모의 따라하며 배우는 C언어
result 이름
int compute_pow에서의 result와int main에서의 result는 서로 다른 메모리인데 우연히 이름이 같은 것이라고 생각하면 될까요??서로 다른 이름으로 만들고 작동해보고 잘 되는 것까지 확인했습니다.
-
미해결홍정모의 따라하며 배우는 C언어
3.12강 부동소수점 한계에서 왜 %e를 쓰나요?
3.12강 강의 후반부에서 underflow를 설명하실 때 min값을 출력하려고 할 때 max를 출력할때와 다르게(max를 출력할 땐 printf에서 %f를 쓰셨는데) %e로 지정을 하셨습니다.제가 %f로 출력할 땐 콘솔창에 값이 제대로 표현되지 않았는데 %e로 했을땐 제대로 표현되는 것을 볼 수 있었습니다. 혹시 이유를 알 수 있을까요?제가 생각한 이유는 min값은 너무 작은 값이라서 f형으로 표현하기엔 너무 작아서 지수식 표현법을 사용해야 정밀도를 잃지 않고 표현한 것이라 생각이 드는데 맞을까요? //underflow float min = 1.401298464e-45F; printf("%e\n", min); // %f가 아니라 %e로 표현한다. min = min / 100.0f; printf("%e\n\n", min); //underflow가 발생해서 숫자가 날아간다.
-
미해결홍정모의 따라하며 배우는 C언어
주소값 크기에 대해서 질문있습니다.
int a;printf("%d",sizeof(&a)); 왜 결과값이 8byte가 나오는지 궁금합니다.
-
해결됨IT 기업 취업을 위한: 코딩테스트 혼자서 정복하기 (C/C++)
코딩테스트 공부법에 대한 질문
안녕하세요. 양질의 강의 제공해 주셔서 정말 감사합니다.강사님의 강의를 통해 배운 내용을 바탕으로 문제를 풀고 있는데 제가 공부하는 방식이 도움이 되는지, 너무 비효율적으로 공부하고 있는 것은 아닌지 싶어서 질문드립니다.저는 평소에 문제를 풀다가 막히는 문제가 있으면, 최대한 머리로 고민해 보다가 머리가 돌아가지 않는다 싶으면 종이에 써가면서 어떻게 풀 수 있을지 고민해 봅니다. 30분에서 1시간 정도 고민해 보는 것 같습니다.해결한 문제는 다른 코드와 제 코드를 비교해 보고 제가 짠 코드보다 다른 코드가 더 효율적이고 깔끔한 것 같다 싶으면 해당 코드를 노트에 정리해둡니다. 해결하지 못한 문제는 어떤 부분을 생각해 내지 못했는지를 답안이 되는 코드와 함께 노트에 정리해둡니다. 이렇게 정리한 코드들은 틈틈이 복기해 봅니다.이런 식으로 공부하는 게 맞는 것인지 답변 부탁드립니다.저번에 한 번 다른 질문을 남겼었는데 그 때 빠르게 답변 남겨주셔서 감사했습니다.
-
미해결홍정모의 따라하며 배우는 C언어
4.9 질문이 있습니다.
강의에서는 잘못 출력되는 예제중 첫번쨰 에서 n3가 1024가 아닌 다른 숫자가 나오는데요 (이 오류의 원인은 이해했습니다)하지만 제가 따라하니 1024로 나옵니다.혹시나 해서 x86으로 하니 강의처럼 오류가 뜨는데요이전에 포인터의 크기와 관련해서 32비트와 64비트를 확인해보라는 답글을 주셔서 이 부분은 이해했는데 지금 부분은 왜 다른지 이해가 가지 않습니다. 답변 부탁드립니다.