指向字符串的指针

didijiji 2012-11-28 08:52:05
VS 2010下有如下代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{
char *p = "daolang";
printf("%s\n", p);
strcpy(p, "123");
printf("%s\n", p);

system("pause");
return 0;
}



输出结果如下:
daolang
daolang


不是应该为:
daolang
123

的么?

难道这里的
strcpy(p, "123");
这句语句没有起到作用?
p应该是会重新指向字符串“123”的啊,为什么strcpy(p, "123");之后,p还是指向了“daolang”啊?
...全文
202 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
breakfisher 2012-11-28
  • 打赏
  • 举报
回复
引用 1 楼 dhdahai 的回复:
好多人问过这个问题了 char *p = "daolang"; p指向的是一个常量字符串,不要试图修改常量字符串
一楼正解,在初始化时,系统将字符串常量“daolang”的首地址赋给p, 由于p指向的是字符串常量"daolang",改变*p,其实际上就是改变常量的值,常量的值是不可修改的。 改成char p[] = "daolang"; 这样就可以, 这个是定义一个char型数组, 然后将字符常量"daolang" 作为初值赋值给p,因为修改p内的内容时,并没有改变常量"daolong"的值。 两者的区别在于,第一种方式时,p只是指向"daolong"的首地址, 第二种方式, 系统给p[]分配了自己的空间,只是将"daolong"赋值给p[]
newtee 2012-11-28
  • 打赏
  • 举报
回复
原来是这样
引用 10 楼 zhanshen2891 的回复:
p是指向常量地址的变量,常量内容在运行时是不可以改变的,如果是debug版的话会弹出 内存不能写入的异常,如果是release版,编译器忽略了strcpy(p, "123");句,所以看到的就是你那个结果。 这个不同的编译器可能效果不一样,VS2008是这样的。
zhanshen2891 2012-11-28
  • 打赏
  • 举报
回复
p是指向常量地址的变量,常量内容在运行时是不可以改变的,如果是debug版的话会弹出 内存不能写入的异常,如果是release版,编译器忽略了strcpy(p, "123");句,所以看到的就是你那个结果。 这个不同的编译器可能效果不一样,VS2008是这样的。
newtee 2012-11-28
  • 打赏
  • 举报
回复
VS跑了一下 报错
  • 打赏
  • 举报
回复
你的那种方法指针p指向常量区,常量区不能写的,你这样strcpy会出错的。 改成数组后,其实就是从常量区拷贝一份过来,这样,你可以对其进行修改了。
newtee 2012-11-28
  • 打赏
  • 举报
回复
几天没看C,这个给忘记了 char *p = "daolang"; 等于 const char *p = "daolang";
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
int main()
{     
    char p[24] = "daolang";
    printf("%s\n", p);

    memset(p, 0, 24);

    strcpy(p, "123");
    printf("%s\n", p);

    system("pause");
    return 0;
} 
这样输出就不会了~
newtee 2012-11-28
  • 打赏
  • 举报
回复
运行一下去 貌似有点问题啊
gaochizhen33 2012-11-28
  • 打赏
  • 举报
回复
引用 3 楼 gaochizhen33 的回复:
C/C++ code?12345daolang段错误(吐核) linux下gcc编译结果,由于p的地址未指定,所以strcpy调用会产生错误。
另外就像一楼说的,p指向的是一个字符串常量,不要试图修改它。
gaochizhen33 2012-11-28
  • 打赏
  • 举报
回复


daolang
段错误(吐核)

linux下gcc编译结果,由于p的地址未指定,所以strcpy调用会产生错误。
newtee 2012-11-28
  • 打赏
  • 举报
回复
就是输出 daolang 123 啊 PS:楼主忘记加#include<string.h>了吧!
dhdahai 2012-11-28
  • 打赏
  • 举报
回复
好多人问过这个问题了 char *p = "daolang"; p指向的是一个常量字符串,不要试图修改常量字符串

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧