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 ;
}