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

时间:2023-01-04 11:31:31

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()的实现就会变的非常简单。