세그멘테이션 오류가 뜨는 이유를 모르겠어요..
글쓴이: facered79 / 작성시간: 금, 2005/08/05 - 10:34오전
#include <iostream>
using namespace std;
typedef struct {
int slotNum;
int boardType;
int boardNum;
int alarmType[10];
}RfmbRdabHwType;
typedef struct {
RfmbRdabHwType HwStatus[];
}alarmtest;
int main()
{
alarmtest s;
int i=0;
for( i=0 ; i<10 ; i++)
{
s.HwStatus[i].slotNum=i+1;
s.HwStatus[i].alarmType[0]=1111;
s.HwStatus[i].alarmType[1]=1;
s.HwStatus[i].alarmType[2]=1111;
s.HwStatus[i].alarmType[3]=0;
s.HwStatus[i].alarmType[4]=1111;
}
return 0;
}
위와 같은 코드를 컴파일 하고 실행하면
오류가 뜹니다..
소스는 간단하고 오류가 발생할 이유가 없어보이는데요..
어디가 잘못된것인가요..
Forums:


Re: 세그멘테이션 오류가 뜨는 이유를 모르겠어요..
HWstatus가 구조체의 배열인데 동적배열이군요..
동적배열이라면 메모리가 할당이 되어 있지 않으니 메모리 오류가 생기는게 아닐까합니다.
typedef struct { RfmbRdabHwType HwStatus[10]; }alarmtest;를 하신 상태로 작성하시거나 동적 배열형태가 필요하다면 new를 이용한 메모리할당을 하신다음에 alarmtest를 사용하도록 변경을 하시기 바랍니다.
struct alarmtest 안의 HwStatus 에 충분한 메모리가
struct alarmtest 안의 HwStatus 에 충분한 메모리가 할당되어있지 않기 때문입니다.
typedef struct { RfmbRdabHwType HwStatus[10]; } alarmtest;와 같이 혹은,
typedef struct { RfmbRdabHwType *HwStatus; } alarmtest; ... s.HwStatus = new RfmbRdabHwType[10]; ...과 같이 (malloc 도 좋구요) 메모리를 할당해주시면 될 것입니다.
훗, 못 믿겠나?
HwStatus[] 에 몇개의 값이 들어가게 될지 모를경우..
그럴 경우에는 변수의 메모리 할당을 어떤 식으로 해야 하나요..
Re: HwStatus[] 에 몇개의 값이 들어가게 될지 모를경우..
1) 위에 소개한 방법과 같이 하되, 그 한계를 넉넉히 준다.
2) 필요한 순간에 필요한 만큼씩 공간을 할당해 나간다.
1) 번의 경우, 그냥 쉽게 쉽게 짜내려갈 수 있는 장점이 있습니다. 만드시는 프로그램이 크게 중요하지 않거나 사용할 데이터의 양이 어느정도 제한적이고 또한 그 실행환경에 그럭저럭 넉넉한 메모리가 있다면 사용할 수 있겠죠.
2) 번의 경우는 말씀시는 것으로 봐서는 구현을 위한 공부와 시행착오가 필요하실것 같습니다만, 어쨌든 유연하게 대처할 수 있는 방식이므로 언젠가는 사용하셔야 할 것입니다. 함수로 보면 malloc(), realloc() 등에 대해서 찾아보시고 그보다 먼저 포인터, 배열에 대한 학습/이해가 필요하실 것 같습니다.
댓글 달기