vc6.0生成时没错,调试时出现unhandled exception in main.exe:0xC0000005:Access Violation求解答

这是代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<LIMITS.h>

//src_fileName out_fileName src_width src_height frameNo
int main(int argc,char* argv[])
{
char src_fileName[255];
char out_fileName[255];

int src_width,src_height;
src_width=src_height=0;

int frameNum=INT_MAX;

int src_size,out_size,tem_size;
src_size=out_size=tem_size=0;
unsigned char *src_buf,*out_buf,*tem_buf;

FILE *in_file,*out_file;

unsigned char *Y,*U,*V;
unsigned char *Y2,*U2,*V2;

unsigned char *p=NULL;

if(argc>5)
{
strcpy(src_fileName,argv[1]);
strcpy(out_fileName,argv[2]);
src_width=atoi(argv[3]);
src_height=atoi(argv[4]);
frameNum=atoi(argv[5]);
}
else
{
strcpy(src_fileName,argv[1]);
strcpy(out_fileName,argv[2]);
src_width=atoi(argv[3]);
src_height=atoi(argv[4]);
}

src_size=(src_width*src_height)<<1;//对于YUY2 4:2:2
src_buf=(unsigned char*)malloc(src_size*sizeof(char));
memset(src_buf,0,src_size);

tem_size=(src_width*src_height)<<1;//对于YUV 4:2:2
tem_buf=(unsigned char*)malloc(tem_size*sizeof(char));
memset(tem_buf,0,tem_size);

out_size=src_width*src_height*1.5;//对于YUV 4:2:0
out_buf=(unsigned char*)malloc(out_size*sizeof(char));
memset(out_buf,0,out_size);

in_file=fopen(src_fileName,"rb");
if(!in_file)
{
printf("cannot open input file.");
return 0;
}

out_file=fopen(out_fileName,"wb");
if(!out_file)
{
printf("cannot write 264 file./n");
return 0;
}
while(frameNum>0&&!feof(in_file))
{
//读出一帧数据
if(fread(src_buf,src_size,1,in_file)<=0)
printf("cannot read from input file.");
p=src_buf;

Y=tem_buf;
U=Y+src_width*src_height;
V=U+(src_width*src_height>>1);

Y2=out_buf;
U2=Y2+src_width*src_height;
V2=U2+(src_width*src_height>>2);

/*由打包YUYV变成平板YUV*/
for(int k=0;k<src_height;++k)
{
for(int j=0;j<(src_width>>1);++j)
{
Y[j*2]=p[4*j];
U[j]=p[4*j+1];
Y[j*2+1]=p[4*j+2];
V[j]=p[4*j+2];
}
p=p+src_width*2;

Y=Y+src_width;
U=U+(src_width>>1);
V=V+(src_width>>1);
}

//复位
Y=tem_buf;
U=Y+src_width*src_height;
V=U+(src_width*src_height>>1);

for(int l=0;l<src_height/2;++l)
{
memcpy(U2,U,src_width>>1);
memcpy(V2,V,src_width>>1);

U2=U2+(src_width>>1);
V2=V2+(src_width>>1);

U=U+(src_width);
V=V+(src_width);
}

memcpy(Y2,Y,src_width*src_height);

fwrite(out_buf,sizeof(char),out_size,out_file);
printf(".");

frameNum--;
}

fflush(out_file);

free(src_buf);src_buf=NULL;
free(tem_buf);tem_buf=NULL;
free(out_buf);out_buf=NULL;

fclose(in_file);
fclose(out_file);

return 0;
}

第1个回答  推荐于2016-03-25
if(argc>5)
{
strcpy(src_fileName,argv[1]);
strcpy(out_fileName,argv[2]);
src_width=atoi(argv[3]);
src_height=atoi(argv[4]);
frameNum=atoi(argv[5]);
}
else
{
strcpy(src_fileName,argv[1]);
strcpy(out_fileName,argv[2]);
src_width=atoi(argv[3]);
src_height=atoi(argv[4]);
}

注:1.argv[]是从0开始,所以如果要取argv[5]则要判断argc > 6或者argc >= 5;
2.报错位置为strcpy(src_fileName,argv[1]),由于argc = 1, argv实际上只有1个值,即argv[0](为应用程序位置),取argv[1]时,数组越界报错。

修改:使用argv[]之前,首先判断长度(即argc)。if...else if....else if....else....方式。追问

我是一个小白,能帮我改改吗 不是很懂

追答

if(argc > 6)
{
strcpy(src_fileName,argv[1]);
strcpy(out_fileName,argv[2]);
src_width=atoi(argv[3]);
src_height=atoi(argv[4]);
frameNum=atoi(argv[5]);
}
else if(argc > 5)
{
strcpy(src_fileName,argv[1]);
strcpy(out_fileName,argv[2]);
src_width=atoi(argv[3]);
src_height=atoi(argv[4]);
}
else
{
return 0;
}
这样不会出问题。但是不知道你想做什么,不一定会符合你的程序目的。

本回答被提问者采纳
第2个回答  2013-07-17
先单步调试,看哪行出错

...exception in main.exe:0xC0000005:Access Violation求解答_百 ...
2.报错位置为strcpy(src_fileName,argv[1]),由于argc = 1, argv实际上只有1个值,即argv[0](为应用程序位置),取argv[1]时,数组越界报错。修改:使用argv[]之前,首先判断长度(即argc)。if...else if...else if...else...方式。

VC6.0调试出错Unhandled exception in 1.exe 0xC0000005: Access Vi...
应该是 scanf("%d“,&score);

...exception in .exe:0xC0000005: Access Violation.问题
检查代码是否有读写文件超出文件大小范围的问题。

...exceptino in 1.exe:0xc0000005:access violation 跪求解答
看是不是数组越界了。

...unhandled exception in .exe:0XC0000005:Access Violation?
scanf("%d,&score");这句错了 应该是 scanf("%d“,&score);

MFC Unhandled exception in ***.exe(OLE32.DLL):0xC0000005:Access Viol...
这个是VC6.0工具设置问题。选择工具(Tool)——>选项(Option)——>调试(Debug)——>勾选《仅仅在时间调试》——>取消勾选《OLE RPC调试》。如下:

Windows10下VC6.0不能进行单步调试怎么办?解决方案
win10正式版是一个全新的操作系统,所以我们在系统中运行类似VC6这类旧软件时,难免会遇到一些问题。比如,现在有些用户在win10环境下运行VC6时,按F10、F11进行单步调试,会出现:Unhandledexceptionin.exe(OLE32.DLL):0xC0000005:AccessViolation的错误,这该怎么办呢?下面,小编就给大家介绍下该问题...

malloc申请空间时遇到的问题unhandled exception in xxx.exe 0xC000000...
另外,对于类,应当使用new分配内存,而尽量不要使用malloc等,因为new步进分配内存,还调用类的构造函数。如果你的node内部在构造时需要动态分配内存的话,就必须用new来动态创建对象。--- 0xC0000005:Access Violation 是访问违规。很多情况可以造成这种问题。还是需要其它的代码......

...exception in *.exe:0xC0000005:Access Violation
我是一个初学者,代码如下,为何总有问题Unhandled exception in *.exe:0xC0000005:Access Violation 10 #include<stdio.h>#include<malloc.h>#include<stdlib.h>typedefintElemType;typedefstructlinknode{ElemTypedata[100];inttop1;inttop2;intMaxSize;}*listack;voidinitstack(listack... #include<stdio.h>#...

...调试程序后出现“unhandled exception in XXX.exe”
说明你用库的某些代码有问题,在input.C地方触发了异常。

相似回答