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

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

*(pStr+j)=*(pStr+j-1) ;从错误的类型来看是内存写入错误,说明对*(pStr+j)的赋值非法

2.然后做了个小测试发现仍然存在这样的错误,说明错误应该是因为指针p指向字符串常量导致。运行时出现错误:LoopMove.exe 中的 0x00cf141c 处有未经处理的异常: 0xC0000005: 写入位置 0x00cf5748 时发生访问冲突。 
出错的位置是: 

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

上程序运行到*(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 ;
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 字符串常量是指在程序中直接使用的字符串,例如:"hello world"。实质上,它是一个指向字符串首字符的指针常量,也就是说,它的值是字符串首字符的地址,而且这个地址是不可修改的。因此,我们可以通过字符串常量来访问该字符串中的字符,但不能修改它们的值。 ### 回答2: 字符串是C语言中用来表示一串字符的一种数据类型。字符串常量是一种特殊的常量,通常用双引号包含起来。字符串常量实质上是一个指向字符串首字符的指针常量。 在内存中,字符串常量被存放在常量区,当程序开始运行时,操作系统会将其加载到内存中。由于字符串常量在内存中是只读的,因此不能修改。在程序运行过程中,如果试图修改字符串常量的值,会导致程序崩溃。 由于字符串常量是一个指向字符串首字符的指针常量,因此可以将其赋值给一个指针变量。例如,下面的代码将一个字符串常量赋值给一个字符型指针变量: ```c char *str = "hello"; ``` 在这种情况下,指针变量str指向字符串常量"hello"的首字符。由于字符串常量是只读的,因此不能使用指针变量修改字符串的值。 另外,需要注意的是,字符串常量在内存中是以null字符('\0')结尾的。这个null字符是用来表示字符串的结束的。 总的来说,字符串常量是C语言中非常重要的一种数据类型。了解字符串常量的特点和用法,可以帮助程序员写出更加健壮和高效的代码。 ### 回答3: 在C语言中,字符串常量指的是一个连续的字符数组,以'\0'作为结尾,由编译器在程序编译时分配内存。常见的字符串常量包括用双引号括起来的字符串字面值,如"hello world"。 实际上,字符串常量在内存中被存储为一个字符数组,即一段连续的内存空间。而一个指针变量存储的是一个地址,也就是内存空间的位置。因此,字符串常量实际上是一个指针常量,即一个指向字符串首字符的不可更改的指针。 例如,下面的语句声明了一个指向字符串常量指针: const char *str = "hello world"; 在这个语句中,str是一个指向字符常量指针,即str指向内存中字符串"helloworld"的首字符位置。由于字符串常量是不可更改的,因此str指向的地址不可更改。如果尝试修改字符串常量的值,程序会在运行时报错。 综上所述,字符串常量实质上是一个指向字符串首字符的指针常量,这也是C语言中常被提及的一种指针类型。熟练掌握字符串常量指针常量的概念对于C语言的学习和开发都非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值