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

정충효님의 프로필 이미지

작성한 질문수

c++ 이상하게 저장되는 코드 질문있습니다

작성

·

156

0

void put2byte(void *dest, uint16_t data){
	*(uint16_t*)dest = data;
}

uint32_t num_data = hdr.get_num_data();
void* offset_array = hdr.get_offset_array(); //오프셋 어레이 받아오기
uint16_t now_data_region_off = hdr.get_data_region_off();
void* data_region = 0;
uint16_t off = 0;
uint16_t remain_data_region_off = now_data_region_off - input_record_size;
put2byte((void*)((uint64_t)offset_array + num_data * 2), remain_data_region_off);

이렇게 되어있는데 remain_data_region_off 이 값이 37이하이면 37이하로 저장되는게 아니라 이상하게 저장이 되는데 무슨 문제인지 모르겠습니다 예를 들어 remain_data_region_off = 37 이면 7717이 저장되는데 num_data가 6일때만 발생합니다 0~5까지는 제가 설정한 값대로 저장이되는데 이유를 모르겠습니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 정충효 님의 질문에 대해 답변드립니다.

제시하신 코드는 주어진 dest 포인터 위치에 data 값을 2바이트 단위로 저장하는 것을 목적으로 하는 것으로 보입니다. 문제의 원인으로 보이는 부분은 put2byte 함수를 호출하는 부분에서, offset_array + num_data * 2 계산 과정에 있습니다. 특히 num_data가 6일 때만 문제가 발생한다고 하셨습니다.

이 현상의 가능한 원인 중 하나는 메모리 오버플로우 또는 메모리 정렬(alignment) 관련 문제일 수 있습니다. uint64_t로 캐스팅하는 과정에서 offset_array가 가리키는 주소에 num_data * 2를 더한 결과가 기대하는 메모리 위치를 넘어서거나, 정렬되지 않은 메모리에 접근하려고 할 때 예상치 못한 동작이 발생할 수 있습니다.

정확한 원인 파악을 위해서는 추가적인 정보가 필요합니다. 예를 들어, hdr.get_offset_array()에서 반환하는 포인터 타입과 이 포인터가 가리키는 메모리 구조, 그리고 input_record_size의 크기 및 get_num_data()에서 반환하는 값의 범위 등이 중요합니다. 또한, put2byte 함수에 전달되는 최종 주소 값이 예상대로 계산되었는지 확인해볼 필요가 있습니다.

문제 해결을 위한 몇 가지 제안입니다:
- offset_array와 연산된 최종 주소에 put2byte가 올바르게 접근하고 있는지 디버거를 통해 확인해보세요.
- num_data가 특정 값일 때만 문제가 발생한다면, 메모리 정렬 문제일 가능성이 있습니다. 구조체 또는 배열의 정렬을 확인해보세요.
- put2byte 호출 전후의 메모리 상태를 점검하여, 예상치 못한 메모리 변경이 발생하는지 확인해보세요.

위의 제안을 통해 문제의 원인을 좁혀볼 수 있길 바랍니다.