char*和char[]的strcpy出错

uchiha_iTachi 2013-09-04 05:02:02
#include<iostream>
int main()
{
char *a = NULL;//"test";
char b[5]= "test";
strcpy(b,a);
std::cout<<b;
system("pause");
}

为什么这样写总是copy不了呢?vs老是中断在strcat.asm里,什么原因呢?是不是strcpy还调用了strcat啊?
还是有其他原因呢,谁知道原理告诉我一下,还有,具体需要怎么改,谢谢!
...全文
564 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-09-06
  • 打赏
  • 举报
回复
引用 25 楼 liyuanhong13 的回复:
总算明白的差不多了,谢谢大家!
你了解一下数组与指针的区别应该就知道了
旋转的棍子 2013-09-05
  • 打赏
  • 举报
回复

#include<iostream>
int main()
{
	char *a = NULL;//"test";
	char b[5]= "test";
        a = (char*)malloc(sizeof(char)*strlen(b));
	strcpy(a,b);
	std::cout<<b;
        free(a);
	system("pause");
}

xiaoyaoxiaonizi 2013-09-05
  • 打赏
  • 举报
回复
引用 13 楼 liyuanhong13 的回复:
[quote=引用 11 楼 xiaoyaoxiaonizi 的回复:] [quote=引用 10 楼 liyuanhong13 的回复:] [quote=引用 7 楼 max_min_ 的回复:]

char *a = "k"; //静态区,只可读,不能修改
char b[5] = "xxx"; //一般栈区,可读可写
//注意越界问题
这怎么能是静态的呢,修改完全没问题啊[/quote] 如果你往a里拷贝就有问题了[/quote]为什么?拷贝里面还有什么更复杂的东西吗[/quote] 因为a指向的是静态存储区,不可写入的。
  • 打赏
  • 举报
回复
引用 30 楼 u011977735 的回复:
好好学习,天天都走上
+1
u011977735 2013-09-05
  • 打赏
  • 举报
回复
好好学习,天天都走上
大卫david 2013-09-04
  • 打赏
  • 举报
回复
strcpy()的参数写反了,即使没写反也不对,NULL是空指针,怎么可以接收字符串的首地址
失散糖 2013-09-04
  • 打赏
  • 举报
回复
cbzjzsb123 2013-09-04
  • 打赏
  • 举报
回复
uchiha_iTachi 2013-09-04
  • 打赏
  • 举报
回复
总算明白的差不多了,谢谢大家!
uchiha_iTachi 2013-09-04
  • 打赏
  • 举报
回复
引用 23 楼 max_min_ 的回复:
[quote=引用 18 楼 liyuanhong13 的回复:] [quote=引用 16 楼 max_min_ 的回复:]

 char *a = "l";//"test";
    a = "ss";
// 亲, 你这不是修改好吧!
//你只是把ss的地址赋值给了a而已,让a从新指向了一个只可读区间
//可以打印地址看看嘛!很基础的,看看书吧!
我有点明白了,你说的修改,指的是修改指针中存的变量的值吧,*a = 's';是这个吧?还有就是难道strcpy是通过*a这种方式进行运作的?所以第一个参数才不能为char *a = “s”;中的a?[/quote]

char *strcpy(char *dest, const char *src);
//是通过src地址找到src中内容,仅仅把内容拷贝到dest这篇地址空间上而已!
//他们各自的地址是没有改变的!

a = "ss"; //这个操作是把"ss"它的地址赋值给a,a的地址已经改变了
[/quote]总算是明白了,感激不尽呐!
max_min_ 2013-09-04
  • 打赏
  • 举报
回复
引用 18 楼 liyuanhong13 的回复:
[quote=引用 16 楼 max_min_ 的回复:]

 char *a = "l";//"test";
    a = "ss";
// 亲, 你这不是修改好吧!
//你只是把ss的地址赋值给了a而已,让a从新指向了一个只可读区间
//可以打印地址看看嘛!很基础的,看看书吧!
我有点明白了,你说的修改,指的是修改指针中存的变量的值吧,*a = 's';是这个吧?还有就是难道strcpy是通过*a这种方式进行运作的?所以第一个参数才不能为char *a = “s”;中的a?[/quote]

char *strcpy(char *dest, const char *src);
//是通过src地址找到src中内容,仅仅把内容拷贝到dest这篇地址空间上而已!
//他们各自的地址是没有改变的!

a = "ss"; //这个操作是把"ss"它的地址赋值给a,a的地址已经改变了
uchiha_iTachi 2013-09-04
  • 打赏
  • 举报
回复
引用 20 楼 u011249050 的回复:
你copy的话要先申请空间把 改成char *a = new char[10];就可以了
好像是strcpy的参数中char*不能为NULL,赋个初值就可以了
uchiha_iTachi 2013-09-04
  • 打赏
  • 举报
回复
引用 19 楼 u011249050 的回复:
[quote=引用 15 楼 liyuanhong13 的回复:] [quote=引用 14 楼 max_min_ 的回复:]

char *a = "k"; //这个是常量字符串,存放在静态区,只可读,不可改!!!!

//有时间看看内存管理吧!
我这修改a完全没问题
#include<iostream>
int main()
{
	char *a = "l";//"test";
	char *b= "test";
	a = "ss";
	//strcpy(a,b);
	std::cout<<a;
	system("pause");
}
[/quote] 你修改a是修改的a的指向,不能修改的是用下表操作时[/quote]恩,这个我明白了,你能解答一下看看我18楼的问题么…
「已注销」 2013-09-04
  • 打赏
  • 举报
回复
引用 18 楼 liyuanhong13 的回复:
[quote=引用 16 楼 max_min_ 的回复:]

 char *a = "l";//"test";
    a = "ss";
// 亲, 你这不是修改好吧!
//你只是把ss的地址赋值给了a而已,让a从新指向了一个只可读区间
//可以打印地址看看嘛!很基础的,看看书吧!
我有点明白了,你说的修改,指的是修改指针中存的变量的值吧,*a = 's';是这个吧?还有就是难道strcpy是通过*a这种方式进行运作的?所以第一个参数才不能为char *a = “s”;中的a?[/quote] 你copy的话要先申请空间把 改成char *a = new char[10];就可以了
「已注销」 2013-09-04
  • 打赏
  • 举报
回复
引用 15 楼 liyuanhong13 的回复:
[quote=引用 14 楼 max_min_ 的回复:]

char *a = "k"; //这个是常量字符串,存放在静态区,只可读,不可改!!!!

//有时间看看内存管理吧!
我这修改a完全没问题
#include<iostream>
int main()
{
	char *a = "l";//"test";
	char *b= "test";
	a = "ss";
	//strcpy(a,b);
	std::cout<<a;
	system("pause");
}
[/quote] 你修改a是修改的a的指向,不能修改的是用下表操作时
uchiha_iTachi 2013-09-04
  • 打赏
  • 举报
回复
引用 16 楼 max_min_ 的回复:

 char *a = "l";//"test";
    a = "ss";
// 亲, 你这不是修改好吧!
//你只是把ss的地址赋值给了a而已,让a从新指向了一个只可读区间
//可以打印地址看看嘛!很基础的,看看书吧!
我有点明白了,你说的修改,指的是修改指针中存的变量的值吧,*a = 's';是这个吧?还有就是难道strcpy是通过*a这种方式进行运作的?所以第一个参数才不能为char *a = “s”;中的a?
uchiha_iTachi 2013-09-04
  • 打赏
  • 举报
回复
引用 16 楼 max_min_ 的回复:

 char *a = "l";//"test";
    a = "ss";
// 亲, 你这不是修改好吧!
//你只是把ss的地址赋值给了a而已,让a从新指向了一个只可读区间
//可以打印地址看看嘛!很基础的,看看书吧!
好吧…那你说的修改是怎么修改的呢?
max_min_ 2013-09-04
  • 打赏
  • 举报
回复

 char *a = "l";//"test";
    a = "ss";
// 亲, 你这不是修改好吧!
//你只是把ss的地址赋值给了a而已,让a从新指向了一个只可读区间
//可以打印地址看看嘛!很基础的,看看书吧!
uchiha_iTachi 2013-09-04
  • 打赏
  • 举报
回复
引用 14 楼 max_min_ 的回复:

char *a = "k"; //这个是常量字符串,存放在静态区,只可读,不可改!!!!

//有时间看看内存管理吧!
我这修改a完全没问题
#include<iostream>
int main()
{
	char *a = "l";//"test";
	char *b= "test";
	a = "ss";
	//strcpy(a,b);
	std::cout<<a;
	system("pause");
}
max_min_ 2013-09-04
  • 打赏
  • 举报
回复

char *a = "k"; //这个是常量字符串,存放在静态区,只可读,不可改!!!!

//有时间看看内存管理吧!
加载更多回复(13)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧