注册 登录
编程论坛 C++教室

急:求助c++问题

lyshyhuangli 发布于 2008-11-11 21:54, 1310 次点击
char* str1="56789";

char* str2="123456789";

strcpy(str1,str2);

cout < <str1 < <endl;

cout < <str2 < <endl;

在debug模式下编译正常,但运行出错;
在release模式下,能正常运行;
答案是:123456789和9.

请高手们分析一下这个结果!!
在线等待……
15 回复
#2
lyshyhuangli2008-11-12 13:41
怎么没人回复啊!!??
#3
pascale2008-11-12 16:06
用数组实现是没问题的
#4
cnbj2008-11-12 17:37
#include <iostream>
using namespace std;
int main()
{
char *str1="56789";
char *str2="123456789";
str1=new char[20];
strcpy(str1,str2);
cout<<str1<<endl;
cout<<str2<<endl;
delete []str1;
return 0;
}
运行错误是因为把str2复制给str1时,str1的空间不够,也就是内存溢出,所以要重新申请空间
#5
pascale2008-11-12 21:37
[bo][un]cnbj[/un] 在 2008-11-12 17:37 的发言:[/bo]

#include
using namespace std;
int main()
{
char *str1="56789";
char *str2="123456789";
str1=new char[20];
strcpy(str1,str2);
cout

如果*str1="123343534654646"就是它本来存储的字符比str2多的时候ms也是不行的?提示段错误,内存不够的问题的应该,这个是为什么呢?
#6
newyj2008-11-12 22:33
*str1="123343534654646" 只是存储了 字符串的 首地址
也就是 sizeof str1  4个字节
#7
toyix2008-11-12 22:50
[bo][un]newyj[/un] 在 2008-11-12 22:33 的发言:[/bo]

*str1="123343534654646" 只是存储了 字符串的 首地址
也就是 sizeof str1  4个字节

首先认为你说的是对的 ,不过是这样 语句strcpy(d,s);
就一定不是简单的把 指针的值修改了,因为那样就不会溢出,


第二点就是  char *s="Golden Global View";
这样的语句 ="Golden Global View";编译的时候应该存储在文字常量区,那么 strcpy(d,s);就一定不可把 字符串内容复过去,因为这等同于修改常量区,这是不允许的  (我刚学c++,这一点也不是很确定)


这两点 看似矛盾 ,我感觉  这就不可以  用 char *s="Golden Global View";
这种形式定义数组  ,只能用  char s【】=“Golden Global View”这种形式才行 ,因为这样的话s的内容是可以改变的  

还有一个就是 我就 strcpy函数的本质不是很懂   ,到底是 只是改变指针的值  ,还是直接把值复了过去   ?


望指教   我  QQ494000816  希望加我讨论
#8
pascale2008-11-12 23:28
[bo][un]newyj[/un] 在 2008-11-12 22:33 的发言:[/bo]

*str1="123343534654646" 只是存储了 字符串的 首地址
也就是 sizeof str1  4个字节

有点不太明白这个
如果是sizeof(str1)结果是4
如果是sizeof(*str1)结果是1
为什么呢
还有就是存放首地址为什么是占1个字节呢?
#9
newyj2008-11-12 23:38
sizeof(str1) 这个是 指针 所以是4个字节
而 sizeof(*str1) 是 一个char类型 所以 就是 1个字节
存放首地址 是用4个字节的
你试试 sizeof &*str1 这个是 几个字节 这个才是 首地址
#10
pascale2008-11-12 23:44
[bo][un]newyj[/un] 在 2008-11-12 23:38 的发言:[/bo]

sizeof(str1) 这个是 指针 所以是4个字节
而 sizeof(*str1) 是 一个char类型 所以 就是 1个字节
存放首地址 是用4个字节的
你试试 sizeof &*str1 这个是 几个字节 这个才是 首地址

显示是4个字节
这个首地址存放的类型是什么,或者和类型有关么?
还有就是sizeof(str1)你说是指针所以4个字节。。这个和类型有关么还是指针都是4个字节?
#11
newyj2008-11-12 23:45
指针 都是4个字节
#12
pascale2008-11-12 23:47
[bo][un]newyj[/un] 在 2008-11-12 23:45 的发言:[/bo]

指针 都是4个字节

soga
那么那个首地址也都是4个字节么
#13
toyix2008-11-13 07:10
[bo][un]pascale[/un] 在 2008-11-12 21:37 的发言:[/bo]


如果*str1="123343534654646"就是它本来存储的字符比str2多的时候ms也是不行的?提示段错误,内存不够的问题的应该,这个是为什么呢?

这个为什么呢
#14
toyix2008-11-14 20:59
4楼的  用关键字 new重新开辟了一段空间  ,str1已经不指向 原来的字符串了 ,当然不会出错了
#15
蜗牛人生2008-11-14 21:35
试试看,应该没问题了
#include<isotream>
#include<string>
using namespace std;
int main ()
{
char* str1="56789";

char* str2="123456789";

strcpy(str1,str2);

cout < <str1 < <endl;

cout < <str2 < <endl;
return 0;
}
#16
toyix2008-11-15 09:39
还是有错啊   楼上那种定义 字符串的方式  ,字符串存储在文字常量区,所以不管两个字符串 谁长谁短,在执行strcpy的时候  ,因为要改变 字符串 所以就会出错   ,
1