작성
·
117
·
수정됨
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요! 강의 잘 듣고 있습니다 ㅎㅎ
다름이 아니라, 게리멘더링 문제에서 comp와 visited를 memset으로 초기화하고 제출했더니 버퍼오버플로우로 런타임에러가 나더라구요,, 0으로 초기화하는 경우에는 memset 쓸 수 있는 걸로 알고 있고, 심지어 0으로 초기화할 때는 memset이 fill보다 빠르지 않나요?ㅠㅠ 그런데 버퍼오버플로우 나는 이유가 궁금합니다!
답변 미리 감사드려요!!! 항상 이른 아침에 답변해주시던데 좋은 하루 보내세요~~
답변 2
0
안녕하세요 밍링님 ㅎㅎ
comp와 visited를 memset으로 초기화하고 제출했더니 버퍼오버플로우로 런타임에러가 나더라구요
>> 함수 사용부분이 잘못 된 것 같습니다. 혹시 전체 코드 올려주시겠어요? ㅎㅎ 스샷으로 보내주시면 제가 디버깅을 못합니다 ㅠ
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
밍링님의 질문 관련하여, memset
과 fill
함수 사용 시 발생할 수 있는 버퍼 오버플로우 문제에 대해서 고민하고 계신 것 같습니다. memset
함수는 주로 배열의 모든 바이트를 특정 값으로 초기화할 때 사용되며, fill
함수는 STL 컨테이너의 요소를 특정 값으로 초기화할 때 사용됩니다. 두 함수 모두 초기화 작업에 널리 쓰이지만, 사용 방식과 적용 상황에 따라 주의해야 할 점이 있습니다.
먼저 memset
이 fill
보다 빠르다는 점은 맞습니다. memset
은 메모리를 바이트 단위로 직접 채우기 때문에, 매우 빠르게 동작하며 주로 0이나 -1과 같은 값으로 초기화할 때 사용됩니다. 이에 반해, fill
함수는 다소 느릴 수 있지만, 모든 데이터 타입에 사용할 수 있으며, 더 일반적인 상황에 적합합니다.
버퍼 오버플로우 문제는 memset
을 사용할 때 주의해야 할 중요한 사항입니다. memset
을 사용하면 지정된 값으로 메모리의 바이트를 채우는데, 이 과정에서 배열의 크기를 넘어서 메모리를 쓰려고 하면 버퍼 오버플로우가 발생합니다. 즉, memset
의 세 번째 인자로 전달하는 크기 값이 실제 배열을 넘어서지 않도록 주의해야 합니다. 또한, memset
은 바이트 단위로 데이터를 채우기 때문에, int
와 같이 바이트 크기가 1바이트가 아닌 데이터 타입에 사용할 때 예상치 못한 결과가 발생할 수 있습니다.
다음은 관련된 질문과 유사한 맥락에서 제가 발견한 질문의 답변입니다:
- 알고리즘 교안 p.70 memset 관련 질문에서는 memset
으로 초기화할 때 0과 -1만 가능하다고 설명되어 있으며, 다른 초기화 값이 필요한 경우 fill
함수의 사용을 권장하고 있습니다.
이 경우, fill
함수를 사용하시거나, 특정 값으로 초기화하고 싶으시면 해당 값에 맞는 방식을 선택하여 사용하시면 됩니다. 다만, 주어진 코드 조각과 직접적인 맥락에서 답변을 제공하는 것이 아니므로, 상황에 맞게 적절히 적용해보시길 권장 드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
헉 죄송합니다 ㅠㅠ 전체코드는 여기있습니다!! http://boj.kr/28fb0cd15f2e4e96b419a2b8409569e6