해결된 질문
작성
·
76
0
안녕하시렵니까
제가 문제를 한번 풀어봤는데 memset으로 배열을 초기화 했을 때 초기화가 잘 안되는 것을 확인 했습니다
아래 코드에서는 carcnt[2]부분 입니다
혹시 제가 함수 사용에 있어 실수 한 부분이 있는지 왜 이런 일이 일어나는 것인지 궁금합니다
아래 코드는 = {0, }를 사용해 통과한 코드이고 주석 부분 풀고 = {0, }부분 지워 주시면 문제의 코드가 나옵니다
강의 재밌게 잘 보고 있습니다 감사합니다 ^^7
답변 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를 기반으로 초기화를 하기 때문에 이부분 참고부탁드립니다.
교안내의 다음 부분 참고부탁드립니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다.
memset
을 사용하여 배열을 초기화했을 때 예상한 초기화가 제대로 이루어지지 않는다고 하셨군요. 이 문제는 memset
의 특성으로 인해 발생할 수 있습니다. memset
은 메모리를 바이트 단위로 처리하기 때문에 배열의 각 요소가 char
가 아닌 경우, 즉 int
나 double
등의 데이터 타입일 경우 예상치 못한 값이 들어갈 수 있습니다. memset
은 0
이나 -1
로 초기화할 때 주로 사용됩니다.
memset
을 사용하여 배열을 초기화할 때 올바르게 초기화되지 않는 부분은 다음과 같은 이유 때문일 수 있습니다:
memset
은 각 배열 요소를 바이트 단위로 초기화합니다. 만약 배열 타입이 int
라면, 각 요소는 4바이트(또는 시스템에 따라 다름)를 차지하게 됩니다. memset
이 이 4바이트를 각각 초기화하지 않고, 바이트 단위로 초기화하기 때문에 문제가 발생할 수 있습니다.
memset
은 주로 모든 요소를 0
으로 초기화하거나 바이트 값으로만 초기화할 수 있기 때문에, int
형 배열에 다른 값으로 초기화하려면 주의가 필요합니다.
memset
을 사용해 특정 값을 설정하려면 메모리 크기에 대한 올바른 이해와 적절한 초기값 설정이 필요합니다. 대신 std::fill
같은 함수가 다른 초기화 값에 대해 더 적합할 수 있습니다.
이를 해결하려면 std::fill
함수를 사용하는 것이 좋습니다. std::fill
함수는 배열이나 벡터의 요소를 통일된 값으로 초기화할 수 있어 memset
의 한계를 극복하는 데 적합합니다.
관련 질문들도 살펴보신다면 도움이 될 것 같습니다:
- 알고리즘 교안 p.70 memset 관련 질문
- 2-S 1325번 효율적인 해킹 문제 질문
이 답변이 mmmg763님의 궁금증을 해결하는데 도움이 되길 바랍니다. 😊
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.