영상에서 5분 20초경에 int는 4바이트인데 여기에 쌓인 것은 보니까 차이가 4가 나는 게 아니고 더 큰 숫자만큼 차이가 나고있죠라고 말씀을 하시는데 쌓였다는 것이 n의 주소번호가 쌓인 거라고 말씀하시는 게 맞죠? 근데 이걸 왜 쌓였다고 표현하는지 이해가 안됩니다. 스택을 쌓을 때 변수가 사용할 메모리가 쌓이게 된다고 했던 거 같은데 메모리가 아닌 메모리의 주소를 쌓인다고 표현하는 게 이해가 안됩니다. 그리고 int는 4바이트인데 여기에 쌓인 것은 보니까 차이가 4가 나는 게 아니고 라고 말씀을 하시는데 int가 4바이트인 것과 주소번호의 숫자가 차이가 4가 날거라고 예상하는 것이 무슨 연관이 있는 건지 이해가 안됩니다. 연관이 있으니 연관이 있는 것처럼 말씀을 하시는 거라 생각은 하는데 도통 이해가 안되네요.
5.12 함수의 인수와 매개변수 강의에도 언급이 돼있길래 봤는데 통 이해를 못하겠어요 함수가 매개변수화 되었다? 매개변수는 함수 선언할 때 void function(void)에서 괄호안에 들어가는게 매개변수 아닌가요? 저는 이 매개변수가 인자를 받아오는 그릇으로 이해를 하고 있는데 이게 매개변수화 되었다는 거랑 연결이 잘 안되네요
안녕하세요! 항상 좋은 강의 만들어 주셔서 감사합니다. 이번에 독하게 시작하는 C를 완강하고 자료구조를 듣는 중입니다. 그런데 C언어를 완강해도 능숙하게 다룰 수 있다는 느낌이 들지 않아서 C 코딩 예제를 플어보고 싶은데 혹시 추천해주실 만한 예제 사이트나 교재가 있으신가요?
2시간동안 꼼지락 거리다가 이상한 폴더에 mingw-w64가 숨어있는 것을 발견하였습니다! 왜인지는 모르겠으나 과거에 C언어 코딩 독학용으로 깔았던 Dev-Cpp(데브씨플플) 폴더 안에 MinGW64라는 이름으로 있는 것 아니겠어요?! 그리고 열어본 결과 존재 합디다... 그래서 신나서 글을 쓰던 도중 '어? 이거 지우고 다시 깔면 에러가 안 뜨지 않을까?' 해서 지워봤습니다 안 되더라구요... 다시 방황하던 중 msys2를 설치하라는 답변글을 보고 설치했었던 msys2 폴더에서 자포자기한 심정으로 gcc.exe를 검색해 봤습니다 그런데 요녀석이 ucrt64\bin 안에도 숨어있더라구요! 그래서 이번에는 실험 그딴거 안하고 바로 연결했습니다
공부한 내용을 테스트해보려고 다음 코드를 작성했습니다. #include <stdio.h> #include <stdlib.h> int var_global_initialized = 1; int var_global_uninitialized; void func_test(); int main(void) { // 값이 저장되는 메모리 영역과 그 주소 // Code 영역 printf("%llu [Code]\n", (unsigned long long)"I am a String."); // Data 영역 printf("%llu [Data]\n", (unsigned long long)&var_global_initialized); // BSS 영역 printf("%llu [BSS]\n", (unsigned long long)&var_global_uninitialized); // Heap 영역 char* var_dynamic = (char*)malloc(sizeof(char) * 100); printf("%llu [Heap]\n", (unsigned long long)var_dynamic); // Stack 영역 func_test(); return 0; } void func_test() { int var_local = 0; printf("%llu [Stack]\n", (unsigned long long)&var_local); }; 메모리 영역 별 간격이 너무 작게 출력되는데 올바르게 작성한게 맞을까요..?? 참조 온라인 컴파일러 링크 문자열 리터럴이 저장되는 메모리 영역 링크 메모리 영역별 예제 코드 링크
안녕하세요 강사님! 아래 서보모터 관련 질문을 썼던 학생입니다:) 같은 문제로 여러 번 질문드려 죄송합니다ㅠㅠ 강사님께서 말씀 주신대로 pwm 파형을 오실로스코프로 찍어봤는데 동작펄스폭 내에서 제대로 출력되고 있었습니다. 혹시 몰라 버튼을 누를때마다 펄스폭이 바뀌는 프로그램을 넣어서 실험해봤을 때도 펄스가 제대로 출력되고 있었습니다. 서보모터에 들어가는 전원 5v도 제대로 들어가는 것도 확인했는데, 서보모터가 동작하지 않습니다ㅠㅠ 근데 해당 서보모터를 아두이노 예제 프로그램으로 돌려보면 문제없이 돌아갑니다. 무엇이 문제인지 예상되는 원인이 있을까요?? 저는 아무리 생각해봐도 뭐가 문제인지 모르겠습니다ㅠㅠ 모터에 전원과 pwm만 제대로 인가되면 동작하는 것이 아닌가요? 사용하는 서보모터는 영상과 같은 sg90입니다!
안녕하세요 수업 잘 듣고 있습니다. malloc함수로 운영체제한테 메모리 공간을 받아온다고 배웠습니다. 이 때는 내가 사용할 메모리 크기을 명시하는데 free로 메모리를 해제할 땐 내가 받아온 메모리 크기를 명시하지 않는데 어떻게 컴퓨터는 할당해준 메모리를 정확하게 해제해줄 수 있나요? 따로 어디에 할당해준 메모리 크기를 저장해두는 건가요?
수업 내용의 프린트 구문은 void swap(int* u, int* v) { printf("%p %p\n", u, v); int temp = *u; *u = *v; *v = temp; } 이런식으로 되어있는데 u와 v에 &기호를 붙혀주면 a, b 와 주소가 다르게 나오는데 어떤 주소인지 잘 모르겠습니다..
int(*ptr_arr)[3]; 위 형태가 int [3] 의 배열을 가리키는 포인터라는 것은 이해했습니다. int arr[3] = { 1, 2, 3 }; int* ptr_arr_1 = arr; printf("%d\n", ptr_arr_1[1]); // 1) int (*ptr_arr_2)[3] = arr; printf("%d\n", ptr_arr_2[0]); // 2) printf("%d\n", ptr_arr_2[0][1]); // 3) printf("%d\n", (*ptr_arr_2)[1]); // 4) 1)의 경우 지금까지 써왔기 때문에 왜 arr 의 1번째 요소가 나오는지 이해했습니다. 2)의 경우 printf 함수 인수가 int [3] 이라는 경고가 나오고 3), 4)의 경우 arr 의 1번째 요소가 출력되는 것을 확인했습니다. int* ptr_arr_1 = arr; 은 1번 의 배열 역참조 연산으로 배열 요소의 값에 접근할 수 있지만 int (*ptr_arr_2)[3] = arr; 은 2번 의 배열 역참조 연산으로 배열 요소의 값이 접근할 수 있는 것 같은데 가리키는 배열이 똑같은 1차원 배열 인데도 왜 이런 차이가 발생하는 걸까요..??
안녕하세요 학습중 개념에 혼동이 생겨 질문글을 남깁니다. 강의는 10.13, 4분 18초 쯤입니다. 예컨대 *(*(parr + 1) + 2) 가 있다 하면 이것이 어떤 값을 나타내는지 그 과정 중에서 혼란스러운 부분이 몇 개 있습니다. 질문과 더불어 제가 잘못 설명하는 부분이 있으면 지적해주시면 감사하겠습니다. parr + 1 는 포인터parr 배열의 2번 째 원소( arr[1] )의 첫 주소, 즉 4의 주소를 가리키는 포인터입니다. 한편, * 라는 기호는 포인터변수에 저장된 주소에 접근하여 그쪽에 저장된 데이터를 들고오는 역참조의 기능을 수행케 합니다. 그렇다면 * 이 붙은 *(parr + 1) 에서는 4의 주소로 접근하여 * 에 의해 4라는 값을 역참조해오게 됩니다. 하지만 그러면 *(4 + 2) 가 되는데 이는 전혀 말이 안 되고 본래의 +2 는 포인터의 산술연산을 위한 것이기에 *(parr + 1) 는 모종의 포인터가 돼야 하고 강의 중에서도 교수님이 그렇게 말씀하셨습니다. (제가 오해하고 있는 부분과 달리 가장 밖에 있는 * 는 실제로 역참조의 기능을 가지는 것이 자명한데도요...) 그래서 정리하자면 *(parr + 1) 는 어떤 주소를 나타내것인지 아니면 모종의 포인터를 의미하는 건지 궁금하며 그리고 *(*(parr + 1) + 2) 의 전체적인 플로우를 정확하게 이해하고 싶습니다. 감사합니다.
안녕하세요. 우분투 disas main으로 어셈블리어로 stack 이 어떻게 쌓는지 공부하는 중인데요. 어셈블리어로 연산코드가 mov라서 제 해석이 틀린건가요? 지역변수는 선언한 순서로 Push된다고 이해했는데 실제로 해보니 달라서 질문드립니다. int type으로 정의한 $0x1, -0x30에서 주소가 -0x3a로 멀어져서 이해가 안돼서 질문 드렸습니다. 그 이후 부터는 stack이 하나씩 지워지면서 rbp 포인터로 가까워 지는 모양으로 이해했는데 char 형태에서 오히려 더 밀려나서 주소가 왜 밀린건지 이해가 되지않습니다. 물론 함수 호출이 아닌 변수를 정의한 거지만 결은 비슷할 거라 생각이 들어서 질문 드립니다. 너무 궁금해서 엉뚱한 질문이지만 알려주시면 감사합니다...