指针到底能不能修改其指向的常量字符串?

来源:互联网 发布:拍网络剧怎么赚钱 编辑:程序博客网 时间:2024/04/29 08:02

http://m.blog.csdn.net/article/details?id=11248789

1.指针到底能不能修改其指向的常量字符串?今天做一个字符串右移函数时,直接使用指针来修改字符串常量的值出现了奇怪运行时错误。
代码如下:

#include"stdio.h"#include"string.h"void LoopMove(char*pStr,int steps) {    char temp ,temp_ch ;    //char*cp=pStr ;    int i ,j ;    int str_len=strlen(pStr) ;    for(i=0;i<steps;i++)    {        temp=*(pStr+str_len-1) ;        for(j=str_len-1;j>0;j--)        {             *(pStr+j)=*(pStr+j-1) ;        }        *(pStr+0)=temp ;    }}int main(){    char *str="abcdefghi" ;    int N=2 ;    LoopMove(str,N) ;    printf("%s",str) ;    return 0 ;}

运行时出现错误:LoopMove.exe 中的 0x00cf141c 处有未经处理的异常: 0xC0000005: 写入位置 0x00cf5748 时发生访问冲突。
出错的位置是:
*(pStr+j)=*(pStr+j-1) ;从错误的类型来看是内存写入错误,说明对*(pStr+j)的赋值非法

2.然后做了个小测试发现仍然存在这样的错误,说明错误应该是因为指针p指向字符串常量导致。

#include<iostream>using namespace std ;int main(){    char*p="abcdefghi" ;    int str_len=strlen(p) ;    char temp=*(p+str_len-1) ;    cout<<"temp:"<<temp<<endl ;    *(p+str_len-1)='k' ;    cout<<"string:"<<p<<endl ;}

上程序运行到*(p+str_len-1)='k'在运行时出错,错误类型是写入内存冲突。<高质量C C++编程指南>这本书上说: 指针p 指向常量字符串(位于常量存储区),常量字符串的内容是不可以被修改的,企图修改常量字符串的内容而导致运行错误。所以这个问题出现的原因是char*p=”abcdefghi”,赋值的是字符串常量,存储在常量存储区,而常量存储区的内容是无法修改的。

3.如果使用数组来代替的话,数据就存储在堆栈空间,堆栈空间的内容是可以修改的,就不会出现运行时错误。

#include"stdio.h"#include"string.h"void LoopMove(char*pStr,int steps) {    char temp ;    //char*cp=pStr ;    int i ,j ;    int str_len=strlen(pStr) ;    for(i=0;i<steps;i++)    {        temp=*(pStr+str_len-1) ;        for(j=str_len-1;j>0;j--)        {             *(pStr+j)=*(pStr+j-1) ;        }        *(pStr+0)=temp ;    }}int main(){    char str[]="abcdefghi" ;    int N=2 ;    LoopMove(str,N) ;    printf("%s\n",str) ;    return 0 ;}
0 0