读书人

参数是char *就不行但是char string

发布时间: 2013-07-09 09:50:48 作者: rapoo

参数是char *就不行,但是char string[]就可以,为什么?
#include<stdio.h>

void reverse_string(char *string)
{
char *str_tmp;
char ch;

str_tmp = string ;

for(; *str_tmp != '\0' ; str_tmp ++ );
str_tmp--;

for(; str_tmp > string ; str_tmp--,string++)
{
ch =*string;
*string = *str_tmp;
*str_tmp = ch;

}

}
int main()
{
void reverse_string(char *string );
char string[] =" hi ,how are you ! "; //如果改成char *string = "hi ,how are you ! "; 在reverse_string里面的 *string = *str_tmp就会出现段错误。 为什么,求解。

reverse_string( string );
puts(string);

return 0;
}

[解决办法]


char *string = "hi ,how are you ! ";//这种方式的话,使用的字面值模式,只读,不可以修改。string是个指针
char string[] =" hi ,how are you ! ";//这种方式,字符串存储在数组中,可以修改,string是个数组。

[解决办法]
char *string = "hi ,how are you ! ";//这个字符串存放在程序的RODATA(read-only)段,不能修改的
char string[] =" hi ,how are you ! "//这个字符串存放在程序的数据栈中,动态分配的内存,可以修改的
[解决办法]
这是问题看来是初学者犯错误最多的问题了,没有之一。
char *str = "hello world"; // 表示你定义了一个字符指针,这个指针指向一个字符串常量,既然是常量那么通过这个指针修改这个常量是不可以的。
char str[] = "hello world"; // 表示你定义了一个字符数组,数组的长度省略没有给出,编译器会根据后边的字符串自动计算,比如这个就是12(11个字符再加一个隐含的结束符'\0'),这个字符数组修改当然就没有问题了
[解决办法]
上面说得很好了:)
[解决办法]
我觉得这是编译原理的问题,不应该从常量变量去理解,从汇编编译角度而不是C语言角度理解

读书人网 >C语言

热点推荐