VC6.0中调用fwrite时出现0xC0000005:Access Violation错误...跪求高人

hellononame 2012-07-09 10:51:30
我从串口处获得128个byte的数据,然后存入数组(未越界),调用fwrite写入文件.

在debug模式下就会出现0xC0000005:Access Violation错误,调用堆栈有以下信息:

NTDLL! 7c91245f()
NTDLL! 7c926970()
NTDLL! 7c9192a3()
NTDLL! 7c91248d()
_heap_alloc_base(unsigned int 4144) line 161
_heap_alloc_dbg(unsigned int 4096, int 2, const char * 0x005fba80 `string', int 59) line 367 + 9 bytes
_nh_malloc_dbg(unsigned int 4096, int 0, int 2, const char * 0x005fba80 `string', int 59) line 242 + 21 bytes
_malloc_dbg(unsigned int 4096, int 2, const char * 0x005fba80 `string', int 59) line 163 + 27 bytes
_getbuf(_iobuf * 0x00625c08) line 59 + 19 bytes
_flsbuf(int -1, _iobuf * 0x00625c08) line 153 + 9 bytes
_fwrite_lk(const void * 0x0012e880, unsigned int 128, unsigned int 1, _iobuf * 0x00625c08) line 171 + 13 bytes
fwrite(const void * 0x0012e880, unsigned int 128, unsigned int 1, _iobuf * 0x00625c08) line 73 + 21 bytes
CPbDocument::ProcessDpbfFileData(char * 0x00da732c, DFileData * 0x0012e87c, unsigned char * 0x0062cae0 unsigned char * out_buffer, unsigned int * 0x0012e904) line 452 + 28 bytes
CAnwTermDlg::ProcessResponse() line 1685

显示好像就在fwrite(pFileData->FileData,pFileData->Datalength,1,fp)的时候出错,而且单步调试的时候可以通过,求高人解答
...全文
416 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
大盗贼娃哈哈 2012-07-09
  • 打赏
  • 举报
回复
不知道回复能的积分不
赵4老师 2012-07-09
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
xiaohuh421 2012-07-09
  • 打赏
  • 举报
回复
fwrite(pFileData->FileData,pFileData->Datalength,1,fp);
建议你把这个函数的参数重写过,再试试.
因为你把第二和第三个参数理解反了.
size_t fwrite(
const void* buffer,
size_t size,
size_t count,
FILE* stream
);
Parameters
buffer
Pointer to data to be written.
size
Item size in bytes.
count
Maximum number of items to be written.
stream
Pointer to FILE structure.
第二个参数是 Item的字节数, 第三个参数才是Item的数量. 你却反过来用,没试过这样是否会有问题.
按道理来说,到是问题不大的, 因为你可以把 你的整个要写入的内存当作是一个Item.
不过试试总是好的.

还有会不会存在野指针的问题, 因为好像你是在线程中进行这样的写操作的,但是保存内容的地址又是外面传进来的.
也许在进程启动后,那个地方已经被释放了.
(没有代码,完全是猜的)

hellononame 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
单步调试的时候没有任何问题??
[/Quote]
单步调试没有任何问题,从串口接收到128byte的数据,然后写入文件,然后再通过串口发出一个OK的消息,没有问题。

我估计fwrite之前分配内存的时候已经出了错误,但是定位不到
W170532934 2012-07-09
  • 打赏
  • 举报
回复
单步调试的时候没有任何问题??
hellononame 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
fwrite(pFileData->FileData,pFileData->Datalength,1,fp);
建议你把这个函数的参数重写过,再试试.
因为你把第二和第三个参数理解反了.
size_t fwrite(
const void* buffer,
size_t size,
size_t count,
FILE* stream
);
Parame……
[/Quote]
这是工程的部分代码麻烦大家看一下:
void CAnwTermDlg::ProcessResponse()
{
.
.
.
if(buf[4] == 0 || buf[4] == 1)//EOF(1 :end 0:continue)
{
DFileData *pFileData = NULL;
pFileData = (DFileData *)malloc(sizeof(DFileData));
if(pFileData == NULL)
{
break;
}
memset(pFileData,0,sizeof(DFileData));

pFileData->DataFlag = buf[4];
pFileData->Datalength = (buf[5]<<8) | buf[6];

if(pFileData->Datalength > MAX_FILEDATA_LENGTH)
pFileData->Datalength = MAX_FILEDATA_LENGTH;
memcpy(pFileData->FileData,buf+7,pFileData->Datalength);
m_pDocument->ProcessDpbfFileData(m_pDocument->gFileName,pFileData,out_buffer,&dwlen);
if(buf[4] == 1)//File data is end,so reset the Filename
{
memset(&m_pDocument->gFileName,0,MAX_NAME_LENGTH);
}
free(pFileData);
}
.
.
.
}
ProcessDpbfFileData函数:
int CPbDocument::ProcessDpbfFileData(char* FileName,DFileData *pFileData,unsigned char* pDpbf,unsigned int* pLength)
{
unsigned char* out = NULL;
FILE *fp = NULL;

*pLength = 5 + 2;
out = pDpbf;

if(!(fp = _tfopen((TCHAR*)gFileName,_T("ab+"))))
{//fopen fail
fclose(fp);
return 1;
}

if(fwrite(pFileData->FileData,pFileData->Datalength,1,fp))
{//fwrite sucess
*out= ANW_SYNC_DATA_REQ;
*(out + 1) = 5-sizeof(Anw_Msg_Header);;
*(out + 2) = ANW_SYNC_EFSW_RET;
*(out + 3) = 1;
*(out + 4) = 1;
*((char*)out+(*pLength) - 2) = 0xd;
*((char*)out+(*pLength) - 1) = 0xa;
}
else
{
fclose(fp);
return 1;
}
fclose(fp);
return 0;
}

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧