월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 C언어
메모리의 '첫 번째 주소' 및 byte 단위 메모리 공간의 저장 순서에 대한 질문
'9.17 포인터 변수의 크기' 강의를 보고, 의문이 생겨 질문 드립니다. 예를 들어, 다음과 같은 코드가 있습니다. int a = 4; float b = 4.0f; double c = 5.0; int *ptr_a = &a; float *ptr_b = &b; double *ptr_c = &c; Q1. 포인터 변수(ptr_a)가 변수(a)에 대하여 저장하는 첫 번째 주소란, 그 변수(a)가 memory에 저장될 때, 가장 마지막에 저장되는 1 byte 메모리 공간의 주소를 의미하는 것이 맞나요? Stack memory에 data가 저장될 때에는 High address로부터 Low address방향으로 저장된다고 알고 있습니다. 포인터는, 변수가 접근하는 메모리 공간의 첫 번째 주소를 저장하는데, 여기서 Memory를 살펴본 바, 첫 번째 주소란, 변수(a)가 stack에 저장될 때, 마지막으로 저장된 1 byte 메모리 공간으로 이해됩니다. 그리고가장 먼저 저장된 변수인 a의 주소는 b, c보다 높은 주소에 위치하고,b의 주소는 c보다 높은 주소에 있습니다. 그렇다면, 변수(a)의 4 byte짜리 메모리 공간들에 대해서도 저장될 때, 가장 먼저 저장되는 메모리 공간은 나머지에 비해 높은 주소에 위치한다고 추론할 수 있습니다. 그러므로 포인터가 저장하고 있는 주소값, 즉 그 변수(a)의 첫 번째 주소란, 가장 마지막에 저장되는 1 byte 크기의 메모리 공간이라고 이해하고 있습니다. Q2. x64에서 debugging을 실행할 때, 가장 나중에 저장되는 변수가 가장 높은 주소를 가지고 있는데, 왜 그렇습니까? x86으로 실행했을 때와 마찬가지로, stack에 쌓이는 메모리 공간들의 주소는 from high to low이어야 한다고 알고 있습니다. x64로 디버깅을 해보니, 먼저 저장되는 변수 자체의 메모리 공간이 저장되는 순서는 high to low 순으로 주소를 가지지만, 각 변수의 첫 번째 주소를 참고해보면, 이상한 점이 있습니다. 가장 마지막에 저장된 변수 c가 가장 높은 주소값을 가지고 있다는 것입니다. stack에 저장되는 메모리들의 주소는 가장 높은 메모리 주소부터 낮은 메모리 주소의 방향으로 저장되는데, 여기서는 x86 환경에서 memory 확인했을 때와 달리 정반대입니다. 왜 그럴까요?
- 미해결홍정모의 따라하며 배우는 C언어
포인터 배열 NULL 초기화
안녕하세요. 포인터 변수에서와 마찬가지로 포인터 배열을 선언할 때 각 element들을 특정한 값으로 초기화 하지 않는 경우, 항상 NULL로 초기화 시켜주는 게 좋을 것 같은데.. 포인터 배열의 size가 큰 경우에 포인터 배열을 선언할 때 모든 element들을 한꺼번에 NULL로 초기화 시키는 방법이 있을까요..? 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
continue와 버퍼
1. continue도 break처럼 가장 마지막 루프에 한해서 적용된다고 생각해도 되나요? 2. 버퍼의 존재는 한 프로그램 당 하나인가요? 예제의 해답에서 큰 while문 안에 마지막에 while문을 이용해서 버퍼 내의 다른 글자들은 다 뺴준다고 하셨는데요 while (getchar()!= '\n') { continue; } 큰 while과 그 안에 작은 while이 버퍼를 공유하는 것 같던데 한 루프 내라서 공유되는건지 한 프로그램 내에서 공유되는것인지 궁금합니다. 3. 저는 c=getchar()와 scanf("%c", c)는 궁극적으로 같다고 생각했었는데 while문의 조건을 놓고 봤을때 while (getchar...)는 입력된 문자들이 어떤 문자인지를 구별 할 수 있는 반면 while (scanf(..))는 입력된 값들이 형식 지정자에 부합하는 값인지 그 읽어낼 수 있는지의 여부(?)를 알려준다는 차이가 있다고 이해했는데 맞는지 궁금합니다..!
- 미해결홍정모의 따라하며 배우는 C언어
소수점 뒷부분 출력, %e로 출력
22:50 에서 콘솔창 3번째 줄에서 첫번째 칸 (123.456001)와 23:05에서 콘솔창 세번째 칸 (1.234560e+02)가 어떻게 나온것인지 모르겠습니다. 우선 첫번째는 float f = 123.456f; 를 %f로 출력한 것인데 이렇게 하면 123.456000도 아니고 왜 123.456001이 나오는지 모르겠습니다. 다음으로 3번째 칸에 1.234560e+02 가 출력된 것은 위의 float f = 123.456f; 를 %e로 출력한 것인데 +02가 뭘 뜻하는지 모르겠습니다. 1.234560에 10^2 를 곱하면 123.4560이 되는 것은 알겠는데 +02가 10^2를 의미하나요? +02는 배운적이 없었던 것 같은데 어떻게 이해하는것인지 모르겠습니다.
- 미해결홍정모의 따라하며 배우는 C언어
매크로 인식 오류
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 매크로를 이용한 기호적 상수 실습을 하다가 오류가 뜨고 궁금한 점이 생겨 질문드립니다. 일단 아래와 같은 코드를 작성했습니다. 이 코드를 실행했을 때 E0075 operand of '*' must be a pointer but has type "float" 위와 같은 에러 문구가 뜹니다. PI를 3.141592f로 매크로를 사용하지 않고 작성했을 때는 에러가 뜨지 않습니다. 아무래도 매크로 상수를 인식하지 못해서 radius 앞에 *을 곱하기 연산자가 아니라 포인터 연산으로 인식한 거 같은데 이를 어떻게 해야 해결할 수 있을까요? 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
realloc() 관련 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 12-14 <메모리 누수와 free의 중요성> 강의에서는 int n = 100000000; int* ptr = (int*)malloc(n * sizeof(int)); for (int i = 0; i < n; ++i) ptr[i] = i + 1; free(ptr); printf("%d %d\n", ptr[0], ptr[1]); 이 코드 부분을 빌드하면 기존에 초기화 해준 이후에 free를 했음에도 불구하고 쓰레기값이 나오고 녹색 밑줄이 그어지면서 비주얼 스튜디오 자체에서 경고를 해주는데 이 강의의 ptr2 = (int*)realloc(ptr, n * sizeof(int)); for (int i = 0; i < n; i++) printf("%d ", ptr2[i]); //copies data printf("\n"); 부분은 빌드를 하면 이부분도 똑같이 초기화를 하고 realloc으로 free가 된것인데 값도 제대로 나오고 비주얼 스튜디오측에서도 아무런 경고를 띄우지 않는데 어떤 점을 보고 ptr이 realloc()에서 해제되었다고 알 수 있을까요?
- 해결됨홍정모의 따라하며 배우는 C언어
형식지정자
형식 지정자는 항상 헷갈리네요 ㅠ... 선생님께서 풀이하실 때 int c를 출력할 떄에 "%c"<문자 형식 지정자를 쓰시더라구요 현재까지 배운 바로는 데이터의 자료형(실수형/정수형인지..)이나 데이터의 크기가 일치하면 바람직한 문장이라는 것은 이해했습니다. 그런데 혼용되는 것들이 너무 헷갈립니다. 예를들어 printf의 경우 작은 범위의 숫자들 끼리는 int나 char을 바꾸어서 써도 정상적으로 출력이 되더군요 그런데 또 scanf를 살펴보니 int b; scanf(" %c", &b); 이를 실행해 봤을때 문자 'A'를 넣으면 'A'(65)의 아스키 코드 값을 b에 저장할 줄 알았는데 저장도 안되더라구요... 그 반대로 char a; scanf("%d", &a); 여기에 65를 넣으니 char a는 'A'로 정확히 뜨구요.. 그래도 print문은 이해는 되는 편입니다. 가령 선생님의 풀이에서도 int c 는 정수형이고 "%c"도 정수형인 char의 형식 지정자이고 숫자의 범위도 %c로 커버가 가능 하기에 정상적으로 출력이 된 점은 이해가 갑니다 근데 scanf는 int b; scanf(" %c", &b);에서 char 자료형보다 큰 int 자료형에 숫자를 %c로 저장하는데 더 넉넉한 공간임에도 저장이 안되고 char a; scanf("%d", &a);에는 마치 정수 자료형으로 읽어들여서 char에 쑤셔넣는 것 같은데 정상적으로 입력이 되더라구요... 왜이런가요ㅠ 제가 너무 과하게 들어갔나요?이게 형식지정자가 맞는듯 안맞는듯 해설같은 데에서도 교묘하게 다르게 사용이 되다보니 헷갈려서 질문드립니다..
- 미해결홍정모의 따라하며 배우는 C언어
4-4 strlen() 함수 - 동적할당
1. 강의 마지막 부분에서 동적 할당 부분을 따라서 하니깐 오류가 뜨더라구요. 그래서 컴파일러에 뜬 오류 C6011링크를 눌러서 시키는 대로 이유는 모르겠지만 따라서 하니깐 오류가 뜨지는 않던데, 저는 오류가 뜨는 이유를 모르겠습니다 2. 저는 숫자가 8,5 이렇게 뜹니다. 그래서 문제점을 제 나름대로 찾아보니깐 sizeof에 마우스를 가져다 대니깐 unsigned int가 안뜨고 unsigned longlong이 뜨던데 제가 혹시 어디 부분에서 실수를 한건지 알 수 있을까요? 3. sizeof 부분을 출력할때 unsigned int니깐 정확히 형식지정자를 쓰면 %u를 쓰는게 더 맞는 표현인가요?
- 미해결홍정모의 따라하며 배우는 C언어
9:40 할당 메모리 관련 질문
할당 메모리의 영역과 연결 상태에 써있는 NA는 의미가 뭔가요??
- 미해결홍정모의 따라하며 배우는 C언어
scanf() 함수의 매개변수 type 질문
안녕하세요. 코드 첨부합니다. Call-by-reference와 함수의 매개변수 type 부분을 공부하다가 궁금한 점이 있어서 질문 드립니다. scanf() 함수에서 &num을 받는 매개변수의 type은 int *가 되고, str을 받는 매개변수의 type은 char * 일텐데.. 함수로 전달되는 인자에 따라서 scanf() 함수 내부적으로 매개변수의 type을 자동으로 형변환 해주는 건가요..? scanf() 함수 정의문을 봐도 내부적으로 어떻게 동작하는지 이해가 잘 되지 않아서 질문 드립니다. 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
<stdlib.h> 재질문
금방 질문드린 <stdlib.h> 에 대한 답변확인하였습니다. 다시 실행해도 잘 되는데 어떻게 된 건지 모르겠습니다. 실행창도 코드 옆에 같이 첨부하였습니다.
- 미해결홍정모의 따라하며 배우는 C언어
<stdlib.h>
18:45에서 <stdlib.h> 를 include 하셨는데 제가 까먹고 안 쓰고 실행시켰는데 19:50에서 보여주시는 실행화면과 같은 결과가 나오는데요. 그러면 stdlib.h를 안 써도 되는 건가요?
- 미해결홍정모의 따라하며 배우는 C언어
Unsigned 부호 없는 양수
9:23 에서 unsigned int의 범위를 계산하실 때 2 ^32-1 을 하셨는데요 unsigned가 항상 양수니까 맨 앞 부호비트가 0으로 고정되어있으면 이 자리는 빼고 뒤에 남은 31개의 비트(0,1 둘다 들어갈 수 있는) 만 생각해서 2^31로 해야하는 거 아닌가요? 그리고 1을 왜 빼는지 잘 모르겠습니다. 그리고 unsigned는 양수만을 나타내면 32비트에서 맨 앞의 부호비트는 항상 0으로 고정되어있는 건가요? 아니면 애초에 부호비트는 signed에서만 생각하는 개념이고 unsigned에서는 해당하지 않는 개념인건가요? 너무 헷갈려요 ㅜㅜ
- 미해결홍정모의 따라하며 배우는 C언어
signed unsigned
signed에서 양수.음수 다 표현이 가능하고 unsinged는 부호가 없는 양수만을 표현하는 것이면 양수를 왜 굳이 signed와 unsigned 두 군데에서 등장시키는 건가요?
- 미해결홍정모의 따라하며 배우는 C언어
sizeof 밑줄 오류
에러창에는 아무것도 뜨지 않는데 보시는 것처럼 초록색 밑줄이 계속 나옵니다. size가 mismatch 되었다고 하는데 밑줄을 없앨 수는 없나요?
- 미해결홍정모의 따라하며 배우는 C언어
실수 정수 맞추기
영상 20:55 에서 0.00089 와 won의 타입이 다르다고 하셨는데 0.00089는 실수이고 won은 7번째 줄에서 float 실수로 선언되어있는데 왜 타입이 다르다고 하시는 건가요? 왜 0.00089 뒤에 f를 붙혀야 하는 것인지 궁금합니다. 그리고 21:53에서 0을 꼭 0.0f로 바꿔야하는 것인가요? 아니면 권장인가요?
- 미해결홍정모의 따라하며 배우는 C언어
지정된 파일을 찾을 수 없습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의 properties-VC++Directories에서 Executable Directories, Include Directories, Library Directories 모두 C파일이 있는 곳으로 path를 지정하였는데도 이렇게 오류가뜹니다. 어떻게해야할까요? 하기를 이용해주세요.
- 미해결홍정모의 따라하며 배우는 C언어
0.00089f
영상 20:55 에서 conversion from 'double' to float 이라는 에러가 떠서 13번째 줄의 0.00089를 dollar와 won의 float형과 같이 맞춰주기 위해 0.00089f 로 고쳐주셨는데요 저는 에러창에 저런 문구가 뜨지 않는데 그러면 안 고쳐도 되는 건가요? f를 붙히기 전에 영상에도 그렇고 제 컴퓨터도 잘 실행되었는데 그러면 f를 붙히는 것과 안 붙히는 것의 차이가 없는 것 아닌가요?
- 미해결홍정모의 따라하며 배우는 C언어
scanf_s 에러 수정방법
영상 5:27 에서요 scanf_s 에러를 수정하기 위해 설정에서 _CRT_SECURE_NO_WARNINGS 를 넣어주는 상황인데 처음 5:27에서는 기존에 쓰여져 있는 문장 맨뒤에 ; 붙히고 _CRT_SECURE_NO_WARNINGS 를 쓰셨는데요 5:36 부터 두번째 방법 소개하실 때( 직접 edit 해서 넣어줄 때는) 맨 뒤에 _CRT_SECURE_NO_WARNINGS를 넣지 않고 _DEBUG 앞에서 엔터 친 다음 _CRT_SECURE_NO_WARNINGS 가 맨 앞에 오게끔 복붙하셨는데 그렇게 되면 첫번째 방법에서는 맨 뒤에 붙히고 두번째 방법에서는 맨 위에 _CRT_SECURE_NO_WARNINGS 가 들어가게 되는데요 순서는 중요하지 않은 건가요?
- 미해결홍정모의 따라하며 배우는 C언어
2:35 질문 있습니다.
저의 비주얼스튜디오의 Tools에는 visual studio command prompt가 없는데 어떻게 생기게 하나요? tools -> command line -> developer command prompt는 있습니다.