首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有怪异行为c++的结构向量

具有怪异行为c++的结构向量
EN

Stack Overflow用户
提问于 2016-03-12 19:53:39
回答 1查看 140关注 0票数 0

我对我的一项任务有问题。我必须读取一个.ts文件,读取包中的包,并从每个包中提取头信息。我已经创建了一个结构化的包,它将保存头部的所有信息,我也有一个向量,在其中我将push_back每个包。问题是,for循环由于某种原因在第163循环上停止。如果我循环直到假设为i=160,那么代码转义结束循环,但是当我打印vector.size()时,我得到了一个非常大的数字,这是没有意义的。我想它应该是一个整数值,就像我到目前为止拥有的代码Packets.Here的推后数一样高:

代码语言:javascript
复制
int main() {


FILE *ts_file = NULL;
ts_file = fopen64("/home/ddd/Desktop/Assignment/Streams/ddd.ts", "rb");

if (ts_file == NULL){
    cout << "No file detected on this path, try again" << endl; // prints !World!
}

TS_Analyzer *ts_analyzer;
ts_analyzer->parse_file(ts_file);


cout << "Finished main" << endl;
return 0;

}

void TS_Analyzer::parse_file(文件*ts_file){

代码语言:javascript
复制
cout << "Inside parser" << endl;

fseek(ts_file,0,SEEK_END);
long file_size = ftell(ts_file);
rewind (ts_file);

number_of_packets = file_size/PACKET_SIZE;
unsigned int current_header_add = 0;
unsigned int i=0;


for (unsigned int j=1; i<number_of_packets; j++)
{
    i++;
    unsigned char TS_raw_header[4];

    cout  << "current position " << int(current_header_add) << endl;

    current_header_add = ftell(ts_file);

    fread(&TS_raw_header, sizeof(TS_raw_header), 1, ts_file);

    Packet current_packet;

    current_packet.sync_byte = TS_raw_header[0];
    current_packet.transport_error_indicator = (TS_raw_header[1] & 0x80) >> 7;
    current_packet.payload_start_indicator = (TS_raw_header[1] & 0x40) >> 6;
    current_packet.transport_priority = (TS_raw_header[1] & 0x20) >> 5;
    current_packet.PID = ((TS_raw_header[1] & 31) << 8) | TS_raw_header[2];
    current_packet.transport_scrambling_control = (TS_raw_header[3] & 0xC0);
    current_packet.adaption_field_control = (TS_raw_header[3] & 0x30) >> 4;
    current_packet.continuity_counter = (TS_raw_header[3] & 0xF);


    stream_packets.push_back(current_packet);

    //cout  << hex << int(current_packet.PID) << endl;
    //cout  << dec << "continuity counter " << int(current_packet.continuity_counter) << endl;
    cout  << " i " << int(i) << endl;

    fseek(ts_file, 184, SEEK_CUR);
 }
cout  << "@@" << endl;
cout << stream_packets.size() << endl;

}

TS_Analyzer类:公共分析器{

公众: TS_Analyzer();~TS_Analyzer();

代码语言:javascript
复制
struct Packet {
    unsigned char sync_byte;
    unsigned char transport_error_indicator;
    unsigned char payload_start_indicator;
    unsigned char transport_priority;
    unsigned int PID;
    unsigned char transport_scrambling_control;
    unsigned char adaption_field_control;
    unsigned char continuity_counter;
};

std::vector<Packet>stream_packets;

int number_of_packets = 0;


void parse_file(FILE *);

};

对于为什么向量push_back中断for循环,以及为什么我不能得到正确的向量大小,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-12 20:16:28

如果我将这段代码放在clang编译器中,下面的代码会出现错误:

代码语言:javascript
复制
TS_Analyzer *ts_analyzer;
ts_analyzer->parse_file(ts_file);

>> variable 'ts_analyzer' is uninitialized when used here

我猜您遇到了未定义的行为:由于ts_analyzer作为ptr是任意随机值,其成员中的数据也是非常随机的。

实际上,我很惊讶这段代码在没有崩溃的情况下运行,尽管你总是很幸运。

如果您想修复这个问题,请尝试通过在堆栈中创建对象来避免指针:

代码语言:javascript
复制
TS_Analyzer ts_analyzer;
ts_analyzer.parse_file(ts_file);

或者,如果确实需要分配内存,至少要填写指针:

代码语言:javascript
复制
auto ts_analyzer = std::make_unique<TS_Analyzer>();
ts_analyzer->parse_file(ts_file);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35962564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档