返回信息流#include<iostream>
void strcp(char *to,char *from)
{
strcpy(to,from);
}
void main()
{
char *str=NULL;
strcp(str,"hello");
}
问这个函数有什么问题吗?应该怎么改正呢?在Linux下运行的话会出现什么状况?
这是一条镜像帖。来源:北邮人论坛 / cpp / #74942同步于 2013/10/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
这个程序有问题吗?应该怎么改正呢?
Mulany
2013/10/31镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
楼主你好,请仔细检查你的程序
1.str需要分配大小适当的空间,然后才能往里面写数据,你这个错误框就是你试图往为NULL的str里面写数据造成的访问冲突;
2.似乎你自己写了一个strcp想要调用,而你main里面直接调用了strcpy;
3.strcpy并不安全,可能造成缓冲区溢出。
#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;
: ...................
再补充两点:
1.请把main函数写成int main()的样子;(再严格一点就是int main(void));
2.Linux报错“段错误(核心已转储)”;
根本原因就是尝试写入0处,而这里是不允许写入的。
参数传递的方向是实参到形参,实参是str和"Hello",形参是to和from,在调用strcp的时候,形参拷贝了实参,然后执行将"Hello"复制到to指向的内存中的操作,但是执行完strcp后形参就释放了,由于不能由形参向实参传递数值,即实参的to指向的内存内容虽然改变了,但是str是没有改变的,即str仍然指向NULL,所以出现非法访问。
和参数传递没关系,strcpy不负责分配空间,str使用没有分配适当的空间。
【 在 winshining 的大作中提到: 】
: 参数传递的方向是实参到形参,实参是str和"Hello",形参是to和from,在调用strcp的时候,形参拷贝了实参,然后执行将"Hello"复制到to指向的内存中的操作,但是执行完strcp后形参就释放了,由于不能由形参向实参传递数值,即实参的to指向的内存内容虽然改变了,但是str是没有改变的,即str仍然指向NULL,所以出现非法访问。
这个地方是指针的传递啊,to也指向NULL吧?
【 在 winshining 的大作中提到: 】
: 参数传递的方向是实参到形参,实参是str和"Hello",形参是to和from,在调用strcp的时候,形参拷贝了实参,然后执行将"Hello"复制到to指向的内存中的操作,但是执行完strcp后形参就释放了,由于不能由形参向实参传递数值,即实参的to指向的内存内容虽然改变了,但是str是没有改变的,即str仍然指向NULL,所以出现非法访问。
因为你给str赋成NULL这货就是空的,不会以\0符号结尾,而strcpy比较的时候是要找这玩意结束的,所以strcpy在找不到\0的时候就会一直找,然后就出错了……,你给str=""应该就可以了