可以直接给字符指针赋值一个字符串吗?

许小五 2016-09-22 10:22:30
#define M “hello world”
char * str = M;

这样写会存在问题吗?我个人觉得会有问题。
我的理解是:因为str是一个随机值,直接指向了内存中的某一个位置,那么对它赋值后相当于直接修改了该地址后的内容,在某些时候(这个概率应该很低)应该会引起系统异常。
...全文
1736 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-09-22
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
paschen 2016-09-22
  • 打赏
  • 举报
回复 1
没问题,这里只是指针赋值,而不是修改指针指向的内容 本应该用const char* = xxx 可以用char*是由于历史原因
小灸舞 版主 2016-09-22
  • 打赏
  • 举报
回复
你用strcpy才是你说的修改了随机值指向的内存里的内容
直接=赋值改变的只是指针的指向,是可以的
wang0635 2016-09-22
  • 打赏
  • 举报
回复 1
不会有问题。 str是一个变量,可以存储任何指向char的地址。 M跟“hello world”一样,编译器会为这个字符串分配合适的空间,存入字符换。这一串空间有起始地址。 把该起始地址复制给str。 str就指向了确定的位置,即“hello world”的起始位置了
  • 打赏
  • 举报
回复
引用 5楼u014523360 的回复:
定义的时候,这么写:const char* ...因为字符串字面量表达式的结果是一个常见^_^量的地址
常量地址
  • 打赏
  • 举报
回复
定义的时候,这么写:const char* ...因为字符串字面量表达式的结果是一个常见^_^量的地址
赵4老师 2016-09-22
  • 打赏
  • 举报
回复
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
赵4老师 2016-09-22
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
许小五 2016-09-22
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
理解讨论之前请先学会如何观察! VC编译选项加/EP /P(项目、属性、配置属性、C/C++、预处理器、预处理到文件:是,预处理取消显示行号:是),重新编译,查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898
嗯,试过了,就是用字符串替换掉了,char * str = “hello world”,请问这样的写法有问题吗?
赵4老师 2016-09-22
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! VC编译选项加/EP /P(项目、属性、配置属性、C/C++、预处理器、预处理到文件:是,预处理取消显示行号:是),重新编译,查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898
  • 打赏
  • 举报
回复
你的理解应该有错。str内部确实是个随机值。因为正是那个随机值。str才是指向的随机值对应的内存啊。所以一旦你赋值了。str就指向你的宏定义M对应字符串常量的值了。(字符串其实就是一个地址而已) str值:00000001;//随机值,这时不知道指向哪。。 “hello world”首地址;11111111; (你应该知道,既然指针是变量,那么指针也是有地址的。不信printf("%x",&str) 区别printf(%x,str) ) char *str=“hello world”; 这时str值变为:11111111;//指向hello world
starytx 2016-09-22
  • 打赏
  • 举报
回复
字符串常量是一个不可更改的值,所以应该赋给const char * 才对,不过赋给char*也可以,只要你不通过这个指针来试图修改指向的字符串就行
starytx 2016-09-22
  • 打赏
  • 举报
回复
字符串常量是一个不可更改的值,所以应该赋给const char * 才对,不过赋给char*也可以,只要你不通过这个指针来试图修改指向的字符串就行
张小飞Official 2016-09-22
  • 打赏
  • 举报
回复 1
引用 9 楼 paschen 的回复:
没问题,这里只是指针赋值,而不是修改指针指向的内容 本应该用const char* = xxx 可以用char*是由于历史原因
这才是最正确的答案

69,371

社区成员

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

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