2012-10-26 149 views
0

作品:指针 - 字符串C++

char *s="sfdggh"; 
char *u="xcvbn"; 

s=u; 
cout << s; 

不起作用:

char *s="sfdggh"; 
char *u="xcvbn"; 

*s=*u; 
cout << s; 

为什么呢? (我已经搜索,但无法理解)

//***************** EDIT ********************************** 

我得到了一些东西。只要确认我的理解,如果我是对的。

char *s; 
char *v; 

char a,b; 

s=&a; 
v=&b; 

s=v; //Address exchange 

类似:

char *s="sfdggh"; 
char *u="xcvbn"; 

s=u; // Address Exchange too!/ Not Value Exchanging 
+2

试试你的编译器能够通过警告编译器给出的警告。你会看到一个警告,它将一个字符串文字(类型为“const char *”)赋给一个'char *'。 – Shahbaz

回答

4

s=u;重新分配指针s,这是完全有效的。

*s=*u;尝试覆盖字符串文字的第一个字符s指向u中的第一个字符,这是非法的。

修改字符串文字是未定义的行为。

char *s="sfdggh"; 
char *u="xcvbn"; 

都是字符串文字。

+0

无法区分“重新分配”和“覆盖” –

+0

@ZobeyrFa,那些是可互换的。问题在于你试图重新分配(覆盖)。重新分配一个指针是可以的,重新分配一个字符串不是。例如,问题与'char * x =“bla”相同; x [1] ='y';'。 –

1

常量字符串文字不能被修改。

0

supointer -types,可以重新分配。

*s*uchar -types被存储在所述存储器的所述code segment
存储在代码段中的任何内容都是非法修改的(否则程序可能会自行更改)。

当你写字符串文本,如源代码"xcvbn",它存储在存储器中,作为char数组的代码段,用你的程序的代码的其余部分。

+1

它存储在代码段中的事实是一个实现细节。问题在于修改字符串文字(不管它们存储在特定实现中的位置)是未定义的行为。 –

+0

尝试访问内存的代码段是导致段错误的原因,这一点很重要。 – EyalAr

0

当你写作* s = * u时,你要改变存储在指向S的地址的第一个位置的存储char值,存储在你指向的地址的第一个位置。

现在

char *s="sfdggh"; 
char *u="xcvbn"; 

这两个都是字符串常量,并作为constant.You可以检查你使用G ++ -Wall