技术干货集中营
直播中

信盈达薛柯

6年用户 26经验值
私信 关注

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

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
   {
       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
using namespace std ;
int main()
{
   char*p="abcdefghi" ;
   int str_len=strlen(p) ;
   char temp=*(p+str_len-1) ;
   cout<<"temp:"<
   *(p+str_len-1)='k' ;
   cout<<"string:"<

}
   上程序运行到*(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
   {
       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("%sn",str) ;
   return 0 ;
}

更多回帖

发帖
×
20
完善资料,
赚取积分