문제

헤더, 트레일러 및 가변 길이 페이로드 필드가있는 패킷을 제작해야합니다. 지금까지 나는 페이로드에 벡터를 사용해 왔으므로 내 구조물이 다음과 같이 설정됩니다.

struct a_struct{
 hdr a_hdr;
 vector<unsigned int> a_vector;
 tr a_tr;
};

벡터의 멤버에 액세스하려고 할 때 나는 Seg 결함을 얻고 전체 structs의 크기가 32를줍니다 (벡터에 약 100 개의 요소를 추가 한 후.

이것은 좋은 접근법입니까? 더 나은 것은 무엇입니까?

이 게시물을 찾았습니다가변 크기 구조물 C ++그는 숯 어레이를 사용하고 있었고 벡터를 사용하고 있습니다.

도움이 되었습니까?

해결책

다른 SO 답변의 솔루션은 C- 특이 적이며 C 배열의 특성에 의존하며 C에서도 Sizeof ()는 가변 크기 구조물의 "진정한"크기를 찾는 데 도움이되지 않습니다. 본질적으로, 그것은 부정 행위이며, 그것은 C ++에서 필요하지 않은 일종의 부정 행위입니다.

당신이하는 일은 괜찮습니다. SEG 결함을 피하려면 C ++의 다른 벡터와 마찬가지로 벡터에 액세스하십시오.

a_struct a;
for(int i = 0; i < 100; ++i) a.a_vector.push_back(i);
cout << a.a_vector[22] << endl; // Prints 22

다른 팁

벡터 유형이 구조물에 상환 되더라도 벡터에있는 유일한 부재는 포인터 일 수 있습니다. 벡터에 멤버를 추가하면 벡터 유형 자체의 크기가 증가하지는 않지만 메모리가 가리키는 메모리는 증가하지 않습니다. 그렇기 때문에 메모리의 구조물 증가의 크기를 볼 수 없으므로 오류가 발생합니다.

일반적으로 사람들이 가변 크기의 구조물을 만들려면 구조물의 마지막 멤버로 배열을 추가하고 길이를 1로 설정하여 그렇게합니다. 구조를 "확장"하도록 주문하십시오. 이것은 거의 항상 확장 배열의 크기를 자세히 설명하는 구조물의 추가 부재와 동반됩니다.

1을 사용하는 이유는 Raymond의 블로그에 철저히 문서화되어 있습니다.

나는이 구현을 부스트에서 보았다 .. 정말 깔끔하게 보인다 ... 가변 길이 페이로드를 갖는 것 ....

class msg_hdr_t 
{
   public:
   std::size_t             len;     // Message length
   unsigned int            priority;// Message priority
   //!Returns the data buffer associated with this this message
   void * data(){ return this+1; }  //
};

이것은 질문에 완전히 관련이 없지만 정보를 공유하고 싶었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top