강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

mmmg763님의 프로필 이미지
mmmg763

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

1-C

1-C memset 배열 초기화 질문-C memset 배열 초기화 질문

해결된 질문

작성

·

76

0

안녕하시렵니까

제가 문제를 한번 풀어봤는데 memset으로 배열을 초기화 했을 때 초기화가 잘 안되는 것을 확인 했습니다

아래 코드에서는 carcnt[2]부분 입니다

혹시 제가 함수 사용에 있어 실수 한 부분이 있는지 왜 이런 일이 일어나는 것인지 궁금합니다

아래 코드는 = {0, }를 사용해 통과한 코드이고 주석 부분 풀고 = {0, }부분 지워 주시면 문제의 코드가 나옵니다

강의 재밌게 잘 보고 있습니다 감사합니다 ^^7

http://boj.kr/5f431b3ae8254d5d9a978ec62d3ca827

답변 2

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 mm님 ㅎㅎ

	memset(parking, 0, 100);

mm님 코드를 보시면 sizeof부분이 100으로 초기화가 되어있는데 이는 int타입(4의 크기) * 25개의 배열만 초기화를 한다는 의미입니다.

sizeof(parking) 이런식으로 초기화를 해주어야 합니다.

memset(carcnt, 0, 4);

예를 들어 이거자체는 carcnt의 첫번째 정수만 0으로 초기화를 한다는 의미가 되어버립니다.

이 때문에 에러가 발생이 된 것 같습니다.

 

sizeof를 잠깐 볼까요?

#include <iostream>
#include <string>
using namespace std;

int main(){
    int n;
    cout << sizeof(n) << "\n"; 

    return 0;
}
// 4

앞의 코드는 4를 반환합니다. int타입은 4바이트이기 때문이죠. ㅎㅎ

 

 

memset은 sizeof를 기반으로 초기화를 하기 때문에 이부분 참고부탁드립니다.

교안내의 다음 부분 참고부탁드립니다.

image.png

 

 


 


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


 

0

안녕하세요, 인프런 AI 인턴입니다.

memset을 사용하여 배열을 초기화했을 때 예상한 초기화가 제대로 이루어지지 않는다고 하셨군요. 이 문제는 memset의 특성으로 인해 발생할 수 있습니다. memset은 메모리를 바이트 단위로 처리하기 때문에 배열의 각 요소가 char가 아닌 경우, 즉 intdouble 등의 데이터 타입일 경우 예상치 못한 값이 들어갈 수 있습니다. memset0이나 -1로 초기화할 때 주로 사용됩니다.

memset을 사용하여 배열을 초기화할 때 올바르게 초기화되지 않는 부분은 다음과 같은 이유 때문일 수 있습니다:

  1. memset은 각 배열 요소를 바이트 단위로 초기화합니다. 만약 배열 타입이 int라면, 각 요소는 4바이트(또는 시스템에 따라 다름)를 차지하게 됩니다. memset이 이 4바이트를 각각 초기화하지 않고, 바이트 단위로 초기화하기 때문에 문제가 발생할 수 있습니다.

  2. memset은 주로 모든 요소를 0으로 초기화하거나 바이트 값으로만 초기화할 수 있기 때문에, int형 배열에 다른 값으로 초기화하려면 주의가 필요합니다.

  3. memset을 사용해 특정 값을 설정하려면 메모리 크기에 대한 올바른 이해와 적절한 초기값 설정이 필요합니다. 대신 std::fill 같은 함수가 다른 초기화 값에 대해 더 적합할 수 있습니다.

이를 해결하려면 std::fill 함수를 사용하는 것이 좋습니다. std::fill 함수는 배열이나 벡터의 요소를 통일된 값으로 초기화할 수 있어 memset의 한계를 극복하는 데 적합합니다.

관련 질문들도 살펴보신다면 도움이 될 것 같습니다:
- 알고리즘 교안 p.70 memset 관련 질문
- 2-S 1325번 효율적인 해킹 문제 질문

이 답변이 mmmg763님의 궁금증을 해결하는데 도움이 되길 바랍니다. 😊

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

mmmg763님의 프로필 이미지
mmmg763

작성한 질문수

질문하기