VC++运行内存不能read问题,大神请看,有重酬
#include<stdio.h>slength(char*m){intn=0;while(*(m+n)!=0)n++;return(n);}voidscopy(char...
#include<stdio.h>
slength(char*m)
{
int n=0;
while(*(m+n)!=0)
n++;
return(n);
}
void scopy(char*t,char*s)
{
int i,n;
n=slength(*s);
for(i=0;i<n;i++)
*(t+i)=*(s+i);
}
main()
{
char a[20],b[]="Come on baby!";
scopy(a,b);
puts(a);
} 展开
slength(char*m)
{
int n=0;
while(*(m+n)!=0)
n++;
return(n);
}
void scopy(char*t,char*s)
{
int i,n;
n=slength(*s);
for(i=0;i<n;i++)
*(t+i)=*(s+i);
}
main()
{
char a[20],b[]="Come on baby!";
scopy(a,b);
puts(a);
} 展开
展开全部
这个问题是因为你从b往a拷贝的时候字符串结束符'\0'没有copy过去,导致以字符串方式输出a时因为字符串没有结束,puts函数read超出了内存有效区域(即a[20]只申请了20个字节的内存,而puts输出时因为没有找到字符串结束符,而一直往后面读取字符并输出,超出了20个字节,而这20个字节后面的内容有可能是没有read权限的,于是就access violation了。)
所以围绕这个问题,有三种解决方案:
1、scopy里面n=slength(*s);改为n=slength(*s)+1;
2、scopy里面for(i=0;i<n;i++)改为for(i=0;i<=n;i++)
3、scopy最后面加一行*(t+i)=0;
还有一个问题
scopy里面n=slength(*s);应该改为n=slength(s); //实际上你写的n=slength(*s);应该是在百度提问时的笔误,因为这样写是无法编译的。
所以围绕这个问题,有三种解决方案:
1、scopy里面n=slength(*s);改为n=slength(*s)+1;
2、scopy里面for(i=0;i<n;i++)改为for(i=0;i<=n;i++)
3、scopy最后面加一行*(t+i)=0;
还有一个问题
scopy里面n=slength(*s);应该改为n=slength(s); //实际上你写的n=slength(*s);应该是在百度提问时的笔误,因为这样写是无法编译的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询