durams
@durams
수강평 작성수
-
평균평점
-
안녕하세요!
게시글
질문&답변
포인터와 변수
안녕하세요? 질문&답변 도우미 durams입니다.포인터 변수는 어떠한 메모리 주소를 담는 변수로, 포인터 변수의 타입은 해당 주소에 위치한 값을 어떤 타입에 기반하여 해석할 것인지를 나타냅니다. 가령 int* 타입의 변수는 가리키는 주소에 위치한 값을 int로 해석할 것임을 의미합니다. 즉, int 변수가 있다면 int*로 가리켜야 올바르게 주소가 가리키는 값을 해석할 수 있습니다. 이는 타입 별로 차지하는 크기와 해석하는 방식이 달라지기 때문에 중요합니다.
- 1
- 2
- 25
질문&답변
질문있습니다.
안녕하세요? 질문&답변 도우미 durams입니다.네, 그렇습니다. 다만 '실행 순서'와 '컴파일러 또는 링커가 읽고 이해하는 순서'는 다를 수 있습니다. 문제는 각각에서 발생할 수 있습니다.
- 1
- 2
- 26
질문&답변
숙제 마지막 부분
안녕하세요? 질문&답변 도우미 durams입니다.연습 문제의 1번의 마지막 문제는 '본 기사만 삭제하기' 인데요, 열람했는지 여부를 확인해서 봤다면 삭제하시면 될 것 같습니다. option_deleted를 삭제된 경우 참을 나타내는 비트 마스크라고 생각하시면 되겠네요.my_article_flags &= ~(option_viewed);은 기사의 삭제가 아닌, 기사를 열람 상태에서 미열람 상태로 되돌리는 것을 의미합니다.
- 1
- 2
- 25
질문&답변
메모리 크기
안녕하세요? 질문&답변 도우미 durams입니다.네, 일반적으로 컴퓨터에서 주소는 바이트 단위로 표현됩니다. double 형 변수는 크기가 8바이트니 8칸을 차지한다고 말할 수 있겠죠. 변수의 메모리 주소에 대한 설명도 맞습니다.
- 1
- 2
- 26
질문&답변
10.6 2차원 배열 연습문제 구현해봤습니다.
안녕하세요? 질문&답변 도우미 durams입니다.잘 구현하신 것 같습니다.double* ptr[3] = { &year2022, &year2023, &year2024 };을 double* ptr[3] = { year2022, year2023, year2024 };로 바꿔도 동일하게 작동하는데요, 왜 그런 것인지 한 번 생각해보세요.질문을 작성하실 때 코드 블록 기능을 사용하면 더 깔끔하게 코드를 첨부할 수 있으니 한 번 사용해보세요.
- 1
- 1
- 22
질문&답변
바이너리 파일을 읽을 때 관련해서 질문 드립니다.
안녕하세요? 질문&답변 도우미 durams입니다.먼저 제시해주신 코드에 문제가 있습니다. 파일에 쓰기 작업을 하고 난 후, fp를 닫아줘야 제대로 동작합니다. 또한 동적 할당한 parr을 해제하는 코드도 없습니다. 제시해주신 실행 결과가 잘 나오는걸로 봐선, 이전의 클립보드 내용을 제시해주신 것 같습니다.네 맞습니다. 파일에 쓰기 작업을 하신 int, float, double 등의 크기가 다르기 때문에, 순차적으로 나열된 비트 패턴이 다르게 해석되었네요.구현하기 나름입니다. 파일 내 특정 부분을 가리키는 커서는 프로그래머가 마음대로 이동시킬 수 있습니다.이것 역시 구현하기 나름입니다. 대부분의 바이너리 파일들은 특정 확장자를 가짐으로써 파일 내 데이터가 어떠한 양식대로 들어있다는 것을 나타냅니다. 어떤 데이터들이 어떤 순서로 어떠한 위치에 있는지를 모두 파일 입출력을 통해 처리할 수 있게 되어있습니다. 그러한 규칙 없이 단순히 데이터를 순서대로 저장해놓기만 한다면 해석하는 건 힘들겠죠.*parr의 출력을 통해 나온 값은 비정상적인 값이 아닙니다. 사실 제시해주신 코드에 문제가 많습니다.write 블록에서 parr에 저장한 int들을 파일에 쓰는 코드가 잘못되었습니다. fwrite는 첫 번째 인자로 데이터가 위치한 버퍼의 주소를 받습니다. &parr이 아니라 parr을 전달해야 합니다. &parr은 버퍼의 주소를 담은 변수의 주소입니다.두 번째 인자와 세 번째 인자는 각각 sizeof(int), 100으로 수정해야 합니다. parr은 배열이 아니기 때문에, sizeof(parr)은 포인터 변수의 크기를 반환합니다.read 블록에서도 역시 int 100개를 읽을 때 size_t c3 = fread(&parr, sizeof(int), n, fp); 가 아니라 size_t c3 = fread(parr, sizeof(int), 100, fp);와 같이 작성해야 합니다. 이유는 b에 설명된 것과 동일합니다.-842150451이라는 값은 hex value로 나타냈을 때 0xcdcdcdcd로 나오는데요, 이는 초기화되지 않은 힙 메모리에 기본값으로 설정되는 값입니다. fread시 잘못된 주소를 전달했기 때문에 애초에 parr이 가리키는 메모리는 아무런 값도 할당되지 않았던 것입니다. 3번의 답변에서 말씀드린것처럼, 바이너리 파일들은 목적과 용도에 따라 담는 데이터의 종류와 형식이 다양합니다. 어떠한 형식으로 데이터가 위치해있는지 알고 있다면, 파일을 해석하는 것도 가능하겠죠. 다만 파일의 내용을 단순히 fread를 반복하는 방식으로 해석하는 것은 사실상 불가능에 가깝습니다. 어떤 데이터를 읽을 지, 각 데이터의 크기는 어느정도일지 등을 모두 고려해야한다는 것인데 절대 쉬운 일이 아니죠. 더군다나 최근의 파일들은 그러한 리버싱을 막기 위해 중간중간에 파일의 난독성을 증가시키는 데이터를 집어넣는 등, 방어 전략도 존재합니다.
- 1
- 2
- 27
질문&답변
if(!parr) exit(1); 을 하는 이유에 대해 질문 드립니다.
안녕하세요? 질문&답변 도우미 durams입니다.해당 내용이 에러인지 경고인지는 따로 말씀해주시지 않아 확실치 않습니다만, 실행은 된다고 하셨으니 경고(warning)이겠네요. 다만 전체 코드가 없다면 정확히 어떤 상황인지 판단하기 어렵습니다. 또한 해당 경고가 Intellisense의 정적 코드 분석의 결과인지, 컴파일러의 실행 결과인지도 모르겠네요.해당 코드 자체만으로는 문제가 발생할 여지가 없어보입니다. 100개의 int를 힙 메모리에 할당하는 것 자체는 가벼운 작업입니다. 하지만 OS가 연계되는 모든 작업(힙 메모리 할당 포함)은 함수의 반환값이나 인자 등을 통해 언제나 그 유효성을 확인하는 것이 중요합니다.
- 1
- 1
- 29
질문&답변
print_binary_loop 함수를 구현해봤습니다.
안녕하세요? 질문&답변 도우미 durams입니다.print_binary_loop강의 영상에서 나온 버전은 실제 순서와는 반대로 숫자가 출력된다는 작은 문제가 있었는데요, 이를 해결하려 시도하신 것으로 보입니다. 맨 앞 자리(MSB)부터 구하기 위해 여러번의 연산을 하고 있는데, 이 방식은 입력 정수 n의 길이가 길어질수록 나머지 연산과 나누기 연산의 횟수가 크게 증가하게 된다는 단점이 있겠죠.강의 마지막에 소개된 것처럼 이후에 배우게 되실 배열을 이용하신다면 이 단점을 해결하실 수 있습니다.print_binary강의 영상의 버전은 n >= 2일 때만 재귀를 진행하지만, 질문자님의 코드는 n > 0일 때도 재귀 호출을 진행합니다. 인자 n이 0일 때에는 아무런 작업도 하지 않으니 의미없는 호출이라고 볼 수 있겠네요. 강의의 코드는 그러한 의미없는 호출을 없앤 버전이라고 보시면 될 것 같습니다. 물론 사용자 시점에서 출력되는 결과는 동일합니다.
- 1
- 2
- 30
질문&답변
11.2 24분2초
안녕하세요? 질문&답변 도우미 durams입니다.좋은 의문이네요. 설명을 드리기에 앞서 말씀드리자면, 본 강의에서 교수님께서 말씀하시는 메모리 레이아웃에 대한 설명은 간소화되어있습니다.첨부해주신 그림은 프로그램이 실행되어 메모리에 로드되었을 때 어떻게 구성되는지를 나타내는데요, 사실 각 segment도 여러 부분으로 구성되어 있습니다. (정확히는 오브젝트 파일일 때는 구분되어있다가 메모리에 로드 시 하나의 segment로 표현되는 주소 공간에 올라간다고 보는 것이 맞겠네요)인터넷에 메모리 레이아웃으로 검색하면 많은 이미지에서 설명하길, 높은 주소에서부터 아래와 같이 설명하곤 합니다.스택힙초기화되지 않은 데이터초기화된 데이터텍스트 또는 코드 세그먼트널리 사용되는 포맷인 ELF (Executable and Linkable Format)에서 마지막의 '텍스트 또는 코드 세그먼트'에는 코드와 더불어 문자열이 포함되구요, 해당 세그먼트 전체가 read-only인 속성을 갖습니다. 그러니 사실 첫 번째 그림의 Read Only DATA segment와 TEXT segment는 하나의 세그먼트로 통합이 되어있습니다. 프로그램 실행 이전 오브젝트 파일에서는 두 영역이 명확히 구분되어 있는데요, 아마 두 레이아웃을 동시에 나타내시려 했던 것 같습니다.혹시 설명이 부족하시다면 다시 말씀해주세요.
- 1
- 1
- 25
질문&답변
1.13 gcc main.c 실행파일이 안만들어집니다
안녕하세요? 질문&답변 도우미 durams입니다.메시지에 studio.h라고 뜨는 것을 보면 오타가 의심되네요. 그런데 아래 줄에는 또 #include 라고 제대로 작성되어있는 것으로 보여 확실하지는 않습니다.gcc 설치하실 때 표준 라이브러리도 같이 제대로 설치되었는지 확인해보셔야 하구요, 환경설정에 계속 막히신다면 Visual Studio를 대신 사용하시는 것도 방법입니다. 해결이 되지 않는다면 다시 질문주세요.
- 1
- 2
- 46




