strcpy函数
来源: 互联网 发布时间:2017-01-04
本文导语: 定义了两个字符串指针 char *x; char *y; 然后对x赋值一个字符串,y没有赋值,在把x的字符串复制到y strcpy(y,x) 提示“段错误”,是什么原因呢? | 给y付一个初值,你y现在的值不确定,会引起段错误 ...
定义了两个字符串指针
char *x;
char *y;
然后对x赋值一个字符串,y没有赋值,在把x的字符串复制到y
strcpy(y,x)
提示“段错误”,是什么原因呢?
char *x;
char *y;
然后对x赋值一个字符串,y没有赋值,在把x的字符串复制到y
strcpy(y,x)
提示“段错误”,是什么原因呢?
|
给y付一个初值,你y现在的值不确定,会引起段错误
|
段错误,往往是非法地址访问引发的。 strcpy这种函数很容易发生非法地址访问的。
在这里,你想从x中把数据拷贝到y,y应该有初始值,同时给x分配足够的空间,规范的做法应该将x初始化。
strcpy是从给定源指针地址处拷贝c语言字符串到指定目标地址处,因此拷贝的内存大小是字符串长度(strlen的结果值)+1,它以null字符为字符串结束标识进行拷贝的。
按照你的那个,由于x指针指向的字符没有初始化,因此会找到第一个null,这个无法确定到底多少个字符,而y指针也没有分配空间,因此指向的内存也无法确定是否是可以访问的。
你应该这样写:
char *x = "my string";
char *y = new char[100]; //起码要大于x的长度,在这里就得大于等于10个字符
memset(y, 100, 0) ;//先将目标内存清为null
strcpy(y,x);//从源x中拷贝到y
在这里,你想从x中把数据拷贝到y,y应该有初始值,同时给x分配足够的空间,规范的做法应该将x初始化。
strcpy是从给定源指针地址处拷贝c语言字符串到指定目标地址处,因此拷贝的内存大小是字符串长度(strlen的结果值)+1,它以null字符为字符串结束标识进行拷贝的。
按照你的那个,由于x指针指向的字符没有初始化,因此会找到第一个null,这个无法确定到底多少个字符,而y指针也没有分配空间,因此指向的内存也无法确定是否是可以访问的。
你应该这样写:
char *x = "my string";
char *y = new char[100]; //起码要大于x的长度,在这里就得大于等于10个字符
memset(y, 100, 0) ;//先将目标内存清为null
strcpy(y,x);//从源x中拷贝到y
|
你仅仅这样改的话,是否有问题完全取决于x这个字符串指针的长度,也就是其指向的内存位置,到第一个null的位置,即字符串长度,因此这个字符串长度很随机的,如果在长度超过你的目标y的空间大小的时候,自然也存在非法地址访问的问题,而且是数组越界,这个可能短时间内没出现问题的现象,但是却破坏了内存,是很危险的。一旦发生问题,还很难debug。
|
无需初始化,strcpy会拷贝结束符的所以不需要memset进行清零。
既然用的是C风格的。
那么
const char *x = "abcdefg";
char *y = (char *)malloc(100);
strcpy(y, x);
如果是C++的话,会更安全。
const char *x = "abcdefg";
string y;
y.assign(x);
|
y没有分配空间,他指向的区域不合法
|
char *x=new char[100];
char *y=“abcde”;
strcpy(y,x)
试试这样
char *y=“abcde”;
strcpy(y,x)
试试这样
|
写反了
应该是
strcpy(x,y)
|
无语,又在用野指针!!!!!!!!!!!!!!!!!!!!!!!
|
memset用错了把。
|
1 楼主对指针还没有掌握
2 楼上的确实memset的第二个 和第三个参数顺序 错了
2 楼上的确实memset的第二个 和第三个参数顺序 错了
|
恩。是写反了。我平时不大写程序,所以不太熟悉。
|
malloc一下y
|
经典的访问野指针错误,楼主需要好好学习C语言啦。
|
呵,我也不经意间犯这种毛病啊,要注意了啊。。。。
|
呵,我也不经意间犯这种毛病啊,要注意了啊。。。。
|
呵,我也不经意间犯这种毛病啊,要注意了啊。。。。