durams
@durams
Reviews Written
-
Average Rating
-
안녕하세요!
Posts
Q&A
11.5 코드 구현
안녕하세요? 질문&답변 도우미 durams입니다.잘 작성해주셨는데요, 몇 가지 개선할 수 있는 점이 보이네요.custom_putputchar의 반환값이 0인지 아닌지를 판별해서 인덱스 변수 i를 증가시키고 있기 때문에 '일단 출력을 시도하고' 반환값으로 뒤늦게 확인하는 형태입니다. 널 문자도 출력하려고 시도하게 되죠. putchar를 비롯한 대부분의 입출력 함수들은 널 문자를 만나면 작동을 멈추긴 하지만, 널 문자를 출력하려고 시도하는 것은 일반적이지 않습니다. putchar를 호출하기 전 *(str + i)가 무엇인지 확인하도록 수정하면 좋을 것 같습니다.custom_put2앞에서 말씀드린 것과 동일한 문제가 있지만, 이외에는 잘 작성하셨습니다.putchar은 EOF를 만나거나 에러가 발생했을 때 반환값으로 EOF를 반환하기 때문에, putchar의 반환값을 그대로 '읽은 문자'로 활용하기에는 부적절한 면이 있습니다.
- 1
- 2
- 13
Q&A
C언어 엔터
안녕하세요? 질문&답변 도우미 durams입니다.네, 문제없습니다. 하나의 문자열 리터럴로 취급됩니다.
- 1
- 2
- 22
Q&A
포인터와 변수
안녕하세요? 질문&답변 도우미 durams입니다.포인터 변수는 어떠한 메모리 주소를 담는 변수로, 포인터 변수의 타입은 해당 주소에 위치한 값을 어떤 타입에 기반하여 해석할 것인지를 나타냅니다. 가령 int* 타입의 변수는 가리키는 주소에 위치한 값을 int로 해석할 것임을 의미합니다. 즉, int 변수가 있다면 int*로 가리켜야 올바르게 주소가 가리키는 값을 해석할 수 있습니다. 이는 타입 별로 차지하는 크기와 해석하는 방식이 달라지기 때문에 중요합니다.
- 1
- 2
- 30
Q&A
질문있습니다.
안녕하세요? 질문&답변 도우미 durams입니다.네, 그렇습니다. 다만 '실행 순서'와 '컴파일러 또는 링커가 읽고 이해하는 순서'는 다를 수 있습니다. 문제는 각각에서 발생할 수 있습니다.
- 1
- 2
- 28
Q&A
숙제 마지막 부분
안녕하세요? 질문&답변 도우미 durams입니다.연습 문제의 1번의 마지막 문제는 '본 기사만 삭제하기' 인데요, 열람했는지 여부를 확인해서 봤다면 삭제하시면 될 것 같습니다. option_deleted를 삭제된 경우 참을 나타내는 비트 마스크라고 생각하시면 되겠네요.my_article_flags &= ~(option_viewed);은 기사의 삭제가 아닌, 기사를 열람 상태에서 미열람 상태로 되돌리는 것을 의미합니다.
- 1
- 2
- 31
Q&A
메모리 크기
안녕하세요? 질문&답변 도우미 durams입니다.네, 일반적으로 컴퓨터에서 주소는 바이트 단위로 표현됩니다. double 형 변수는 크기가 8바이트니 8칸을 차지한다고 말할 수 있겠죠. 변수의 메모리 주소에 대한 설명도 맞습니다.
- 1
- 2
- 26
Q&A
10.6 2차원 배열 연습문제 구현해봤습니다.
안녕하세요? 질문&답변 도우미 durams입니다.잘 구현하신 것 같습니다.double* ptr[3] = { &year2022, &year2023, &year2024 };을 double* ptr[3] = { year2022, year2023, year2024 };로 바꿔도 동일하게 작동하는데요, 왜 그런 것인지 한 번 생각해보세요.질문을 작성하실 때 코드 블록 기능을 사용하면 더 깔끔하게 코드를 첨부할 수 있으니 한 번 사용해보세요.
- 1
- 1
- 22
Q&A
바이너리 파일을 읽을 때 관련해서 질문 드립니다.
안녕하세요? 질문&답변 도우미 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
Q&A
if(!parr) exit(1); 을 하는 이유에 대해 질문 드립니다.
안녕하세요? 질문&답변 도우미 durams입니다.해당 내용이 에러인지 경고인지는 따로 말씀해주시지 않아 확실치 않습니다만, 실행은 된다고 하셨으니 경고(warning)이겠네요. 다만 전체 코드가 없다면 정확히 어떤 상황인지 판단하기 어렵습니다. 또한 해당 경고가 Intellisense의 정적 코드 분석의 결과인지, 컴파일러의 실행 결과인지도 모르겠네요.해당 코드 자체만으로는 문제가 발생할 여지가 없어보입니다. 100개의 int를 힙 메모리에 할당하는 것 자체는 가벼운 작업입니다. 하지만 OS가 연계되는 모든 작업(힙 메모리 할당 포함)은 함수의 반환값이나 인자 등을 통해 언제나 그 유효성을 확인하는 것이 중요합니다.
- 1
- 1
- 29
Q&A
print_binary_loop 함수를 구현해봤습니다.
안녕하세요? 질문&답변 도우미 durams입니다.print_binary_loop강의 영상에서 나온 버전은 실제 순서와는 반대로 숫자가 출력된다는 작은 문제가 있었는데요, 이를 해결하려 시도하신 것으로 보입니다. 맨 앞 자리(MSB)부터 구하기 위해 여러번의 연산을 하고 있는데, 이 방식은 입력 정수 n의 길이가 길어질수록 나머지 연산과 나누기 연산의 횟수가 크게 증가하게 된다는 단점이 있겠죠.강의 마지막에 소개된 것처럼 이후에 배우게 되실 배열을 이용하신다면 이 단점을 해결하실 수 있습니다.print_binary강의 영상의 버전은 n >= 2일 때만 재귀를 진행하지만, 질문자님의 코드는 n > 0일 때도 재귀 호출을 진행합니다. 인자 n이 0일 때에는 아무런 작업도 하지 않으니 의미없는 호출이라고 볼 수 있겠네요. 강의의 코드는 그러한 의미없는 호출을 없앤 버전이라고 보시면 될 것 같습니다. 물론 사용자 시점에서 출력되는 결과는 동일합니다.
- 1
- 2
- 30




