BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #74942同步于 2013/10/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

这个程序有问题吗?应该怎么改正呢?

Mulany
2013/10/31镜像同步8 回复
#include<iostream> void strcp(char *to,char *from) { strcpy(to,from); } void main() { char *str=NULL; strcp(str,"hello"); } 问这个函数有什么问题吗?应该怎么改正呢?在Linux下运行的话会出现什么状况?
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
doit机器人#1 · 2013/10/31
楼主你好,请仔细检查你的程序 1.str需要分配大小适当的空间,然后才能往里面写数据,你这个错误框就是你试图往为NULL的str里面写数据造成的访问冲突; 2.似乎你自己写了一个strcp想要调用,而你main里面直接调用了strcpy; 3.strcpy并不安全,可能造成缓冲区溢出。
doit机器人#2 · 2013/10/31
#include <stdlib.h> #include <stdio.h> #include <malloc.h> #include <string.h> void strcp(char *toBuf, int bufSize, char *fromBuf) { strcpy_s(toBuf, bufSize, fromBuf); } int main(int argc, char *argv[]) { int size = (strlen("hello")+1)*sizeof(char); char *str = (char *)malloc( size ); strcp(str, size, "hello"); return 0; } 仅供参考 【 在 doit 的大作中提到: 】 : 楼主你好,请仔细检查你的程序 : 1.str需要分配大小适当的空间,然后才能往里面写数据,你这个错误框就是你试图往为NULL的str里面写数据造成的访问冲突; : 2.似乎你自己写了一个strcp想要调用,而你main里面直接调用了strcpy; : ...................
iam19891211机器人#3 · 2013/10/31
再补充两点: 1.请把main函数写成int main()的样子;(再严格一点就是int main(void)); 2.Linux报错“段错误(核心已转储)”; 根本原因就是尝试写入0处,而这里是不允许写入的。
a206206机器人#4 · 2013/10/31
lz,请仔细阅读c语言书籍
winshining机器人#5 · 2013/10/31
参数传递的方向是实参到形参,实参是str和"Hello",形参是to和from,在调用strcp的时候,形参拷贝了实参,然后执行将"Hello"复制到to指向的内存中的操作,但是执行完strcp后形参就释放了,由于不能由形参向实参传递数值,即实参的to指向的内存内容虽然改变了,但是str是没有改变的,即str仍然指向NULL,所以出现非法访问。
doit机器人#6 · 2013/10/31
和参数传递没关系,strcpy不负责分配空间,str使用没有分配适当的空间。 【 在 winshining 的大作中提到: 】 : 参数传递的方向是实参到形参,实参是str和"Hello",形参是to和from,在调用strcp的时候,形参拷贝了实参,然后执行将"Hello"复制到to指向的内存中的操作,但是执行完strcp后形参就释放了,由于不能由形参向实参传递数值,即实参的to指向的内存内容虽然改变了,但是str是没有改变的,即str仍然指向NULL,所以出现非法访问。
Mulany机器人#7 · 2013/10/31
这个地方是指针的传递啊,to也指向NULL吧? 【 在 winshining 的大作中提到: 】 : 参数传递的方向是实参到形参,实参是str和"Hello",形参是to和from,在调用strcp的时候,形参拷贝了实参,然后执行将"Hello"复制到to指向的内存中的操作,但是执行完strcp后形参就释放了,由于不能由形参向实参传递数值,即实参的to指向的内存内容虽然改变了,但是str是没有改变的,即str仍然指向NULL,所以出现非法访问。
hailangge机器人#8 · 2013/11/3
因为你给str赋成NULL这货就是空的,不会以\0符号结尾,而strcpy比较的时候是要找这玩意结束的,所以strcpy在找不到\0的时候就会一直找,然后就出错了……,你给str=""应该就可以了