【问题标题】:segmentation fault while writing to a file写入文件时出现分段错误
【发布时间】:2019-02-14 10:05:51
【问题描述】:

写入文件时出现分段错误,代码如下

我正在以二进制模式打开一个文件。我有 memcpy 许多结构到一个数组,然后将数据写入文件(命名为 sample.avi)

ofstream AVI;
AVI.open("sample.avi",ios::binary);

if(!AVI)
{
   cout << "AVI file not opening"<<endl;
   return 0;
}

long long int size = 0;
size = sizeof(List) + sizeof(List) + sizeof(AVIMainHeader) + sizeof(List) + sizeof(AVIStreamHeader) + sizeof(BitmapInfoHeader) + sizeof(BitmapInfoHeader) + sizeof(List);
 cout << size;
uint8_t *AVIFile = new uint8_t[300];

List riff = MakeRiffHeader();
List hdrl = MakeHdrlHeader();
AVIMainHeader avih = MakeAvihHeader();
List strl = MakeStrlHeader();
AVIStreamHeader strh = MakeStrhHeader();
BitmapInfoHeader bit = MakeBitHeader();
List movi = MakeMoviHeader();

long long int length1 = 0;

memcpy(&AVIFile[length1], (const void*)&riff, sizeof(List));
length1 += sizeof(List);

memcpy(&AVIFile[length1], (const void*)&hdrl, sizeof(List));
length1 += sizeof(List);

memcpy(&AVIFile[length1], (const void*)&avih, sizeof(AVIMainHeader));
length1 += sizeof(AVIMainHeader);

memcpy(&AVIFile[length1], (const void*)&strl, sizeof(List));
length1 += sizeof(List);

memcpy(&AVIFile[length1], (const void*)&strh, sizeof(AVIStreamHeader));
length1 += sizeof(AVIStreamHeader);

memcpy(&AVIFile[length1], (const void*)&bit, sizeof(BitmapInfoHeader));
length1 += sizeof(BitmapInfoHeader);

memcpy(&AVIFile[length1], (const void*)&movi, sizeof(List));
length1 += sizeof(List);

AVI.write(reinterpret_cast<char*>(AVIFile),length1);

Chunk vidf;
vidf.Ckid = MakeFourCC("00db");
vidf.CkSize = 2048 * 1537;

AVI.write(reinterpret_cast<char*>(&vidf), sizeof(vidf));
AVI.write(reinterpret_cast<char*>(red), 2048 * 1537);

AVI.close();
return 0;

我从writing(AVI.write(reinterpret_cast&lt;char*&gt;(AVIFILE), length1)) 开始的行和下面的行似乎是分段错误的来源(好像我们评论它,它没有给出错误)。

请指出我哪里错了

编辑:

uint8_t *BUFFER = new uint8_t[length];                   
uint8_t *BUFFER1 = new uint8_t[(3 * length) / 2];
uint8_t *final_image = new uint8_t[(3 * length) / 2];
uint8_t *red = new uint8_t[2048 * 1546];            
uint8_t *green1 = new uint8_t[2048 * 1546];         
uint8_t *green2 = new uint8_t[2048 * 1546];         
uint8_t *blue = new uint8_t[2048 * 1546];           

【问题讨论】:

  • 为什么要先复制到数组再写入数组?为什么不直接写结构呢? AVI.write(reinterpret_cast&lt;char*&gt;(riff),sizeof riff); AVI.write(reinterpret_cast&lt;char*&gt;(hdrl),sizeof hdrl); ...
  • 好的,我会试试的
  • 我不认为这是错误(除非您的 300 字节数组不够大)。
  • 但我需要在此之后存储视频帧,然后保留一个偏移量以供阅读,所以认为最好在数组中进行
  • 什么是red?我没有看到任何声明。

标签: c++ file-handling


【解决方案1】:
AVI.write(reinterpret_cast<char*>(&red), 2048 * 1537); 

应该是

AVI.write(reinterpret_cast<char*>(red), 2048 * 1537); 

当你有一个指针时,你不需要添加&amp; 来获取指向的地址,你只需使用指针本身。

【讨论】:

  • 对不起,约翰,它没有帮助
  • 无论我如何写入文件,它只是给出分段错误
  • 那么上面的改变对于获得一个工作程序来说绝对是必要的,即使它不能解决你的崩溃。我建议您删除一小部分代码,直到崩溃消失。如果你能找到最小的代码段,当它被删除时可以停止崩溃,那么这个错误很可能在该段代码中。
  • 好的,我肯定会改变它。正如我在我的问题中所说,如果我评论我开始写入文件的行,它将停止给出错误(从行 AVIFILE.write(retinterpret_cast), length1) 直到 AVI.close();跨度>
  • 感谢 john,hit and trail 方法有效,问题出在 MakeAVIMainheader 函数中,该函数位于其他文件中,但谢谢
猜你喜欢
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2022-01-03
  • 2014-04-04
  • 2016-09-02
  • 2021-06-14
  • 2020-09-14
相关资源
最近更新 更多