给字符串数组赋值,运行时错误,怎么回事

One-_-Piece 2013-09-05 10:37:02
如下代码:
两种情况,为什么一种可以,另外一种不可以?

#include <iostream>
using namespace std;

int main()
{
char *c = "hello world ";
*c = 't'; // false why?

char d[] = "hello world ";
d[0] = 't'; // ok why?

return 0;
}
...全文
167 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-09-06
  • 打赏
  • 举报
回复
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
大尾巴猫 2013-09-06
  • 打赏
  • 举报
回复
char* c = "hellow world"; 这是历史遗留问题。据说以后的c++会不允许这样定义。 实际上,应该这样定义 const char* c = "helllow world"; 这样就很清楚了。c是一个指向字符串常量的指针。 修改*c是不合法的。
pengyw 2013-09-06
  • 打赏
  • 举报
回复
要求学习学习再学习!
BT_Dana 2013-09-06
  • 打赏
  • 举报
回复
看内存管理你就疯了, 以你目前的水平, 看那个肯定会吃力的. 就了解下c里面的数组和指针, 以及堆区, 栈区, 代码区, 静态(全局)区, 常量区(有时候常量去也算在静态区里)这几个区的概念就可以, 这些都是基础知识. 帮你找了个帖子, 你可以简单了解下这几个区:http://blog.163.com/zb_075/blog/static/37340328201151102756835/ 了解了数组和指针以及常量区, 这个问题你就明白了. d[]是个栈数组, 拥有自己的空间, 里面的内容它随便改, 有这个权限. c则是个指针, 它指向常量字符串"hello world "的首地址, 而常量字符串在常量区, 这个区里的东西是不能改的. 外行一点的理解方式就是你有这个地方的地址, 对于这个地方的东西你可读, 但不可写. c是个指针, 是个变量(指针变量, 和int变量没什么本质区别), 你可以c++, 则c的值就变了, 原来指向'h', ++后就指向'e'了. d[]是个数组, d这个符号代表它的首地址, 是个常量, 你可以d[0]='t', 也可以d[3]='t', 就是说可以通过偏移量对这个数组进行操作, 但是d++就错了, 它是数组的首地址, 是常量, 而不是指针变量.
farmliver 2013-09-06
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:

  char *c = "hello world ";
//这样说吧, 这里是把"hello world"的地址赋值给了p
//让p指向了它的首地址,它本上是常量字符串,存放在静态区,只可读不可更改
 
 char d[] = "hello world ";
//这里是初始化d[]数组,把“hello world”这静态区的内容赋值给d[];
//d数组本身在栈区,只是”hello world“拷贝一份给到d数组而已
//改变的是栈区的值而已, 实际原始的值没有改变
++
zybjtu 2013-09-06
  • 打赏
  • 举报
回复
《c和指针》可以帮助你
modyaj 2013-09-06
  • 打赏
  • 举报
回复
引用 6 楼 yht8708 的回复:
char *c = "hello world "; 相当于结婚倒插门。。。把自己放到人家里,不能乱动人家的东西。 char d[] = "hello world "; 相当于正常结婚,把人放到自己家里,随便给她打扮。。。
yht8708 2013-09-06
  • 打赏
  • 举报
回复
char *c = "hello world "; 相当于结婚倒插门。。。把自己放到人家里,不能乱动人家的东西。 char d[] = "hello world "; 相当于正常结婚,把人放到自己家里,随便给她打扮。。。
发型不乱hy 2013-09-06
  • 打赏
  • 举报
回复
参见二楼回答,第一个默认是常量字符串,不可修改 相当于声明了一个指针,指针指向了静态区的一个常量字符 第二个是栈区数组初始化 相当于声明了一个字符数组,然后给数组初始化了,跟声明一个int数组并初始化为几个数字一样的道理
海的神话 2013-09-05
  • 打赏
  • 举报
回复
char *c = "hello world ";字符串常量,c指针指向该常量区的首地址。你懂的,常量看到不能修改其内容啦
u010574425 2013-09-05
  • 打赏
  • 举报
回复
的确不行,看了CPP字符串和字符串函数,说得也不明白
max_min_ 2013-09-05
  • 打赏
  • 举报
回复

  char *c = "hello world ";
//这样说吧, 这里是把"hello world"的地址赋值给了p
//让p指向了它的首地址,它本上是常量字符串,存放在静态区,只可读不可更改
 
 char d[] = "hello world ";
//这里是初始化d[]数组,把“hello world”这静态区的内容赋值给d[];
//d数组本身在栈区,只是”hello world“拷贝一份给到d数组而已
//改变的是栈区的值而已, 实际原始的值没有改变
max_min_ 2013-09-05
  • 打赏
  • 举报
回复

char *c = "hello world ";
     *c = 't';  // false why?
 // 常量字符串, 存放在静态去,内容不可更改

    char d[] = "hello world ";
    d[0] = 't';  // ok   why?
// 一般情况下是栈区, 内容可改

//推荐楼主看看内存管理这方面的知识

69,371

社区成员

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

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