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 ; }4.如果使用strcpy或者memcpy函数的话,LoopMove()的实现就会变的非常简单。