字符串反转引发的char str[]="abc"和char *str="abc"思考

来源:互联网 发布:犀牛o2o源码 编辑:程序博客网 时间:2024/06/08 08:43

尝试写一个字符串反转的函数,不开劈内存空间,通过指针首尾交换完成反转,代码如下:

#include <stdio.h>#include <string.h>char *reverseString(char *str){    char *start=str;    char *end=start+strlen(str)-1;    char temp;    while(start < end)    {        temp=*start;        *start=*end;        *end=temp;        start++;        end--;    }    return str;}void PRINT(char *str){    int i=0;    while(*str != '\0')    {        printf("%c",*str++);    }    printf("\n");}int main(){    char *Pstr="can i help you!";    //char str[]="can i help you!";    //char *Pstr=str;    char *strTemp;    PRINT(Pstr);    strTemp=reverseString(Pstr);    PRINT(strTemp);    return 0;}

编译没问题,运行时提示

can i help you!Segmentation fault (core dumped)

gdb调试发现在这一行出现问题

*start=*end;

原因分析:

char *Pstr="can i help you!";

在这个声明中,”can i help you!”被存储在静态数据区 ,而且是全局的,p仅仅就是个指针(存储在栈内存当中),指向这个区域,任何尝试对此区域赋值的操作都是非法的。

推荐用法:

const char *Pstr="can i help you!";

加const显示声明

推荐阅读:
char *p=”abc” 与 char p[]=”abc” 的区别
函数返回值—返回局部变量内容

0 0