首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

参数是char *就不行,但是char string[]就可以,为啥

2013-07-09 
参数是char *就不行,但是char string[]就可以,为什么?#includestdio.hvoid reverse_string(char *string

参数是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语言角度理解

热点排行