Chinaunix

标题: 初级问题求教:指针操纵字面量字符串问题 [打印本页]

作者: ppm10103    时间: 2013-05-04 10:11
标题: 初级问题求教:指针操纵字面量字符串问题
本帖最后由 ppm10103 于 2013-05-04 11:33 编辑

还得劳烦一下,
那指针字符串字面量是定义在DATA段,只读
那数组字符串字面量为什么就定义在堆栈段呢,可以读写,为啥不也在DATA段呢

  1. #include <iostream>
  2. using namespace std;

  3. int main() {
  4.         cout << "ARRAY" << endl;
  5.         char c[20] = "hello world!\0";
  6.         c[0] = 'd';
  7.         for (int i = 0; i < 20; i++) {
  8.                 cout << c[i];

  9.         }
  10.         cout << endl;
  11.         cout << "POINT" << endl;
  12.         char *pc = "hello world!";
  13.         *pc = 'a';
  14.         while (*pc) {
  15.                 cout << *pc;
  16.                 pc++;
  17.         }
  18.         cout << endl;
  19.         cout << "OVER" << endl;
  20.         return 0;
  21. }

复制代码
结果是
ARRAY
dello world!
POINT

为什么没有看到第二个循环打印的结果呢?
作者: ppm10103    时间: 2013-05-04 10:40
自己顶一下,就是*pc = 'a'; 这个为什么不起作用呢?
作者: linux_c_py_php    时间: 2013-05-04 10:52
字符串常量不可以修改.
作者: Frahm    时间: 2013-05-04 10:52
你确信没有崩吗?
作者: ppm10103    时间: 2013-05-04 11:29
还得劳烦一下,
那指针字符串字面量是定义在DATA段,只读
那数组字符串字面量为什么就定义在堆栈段呢,可以读写,为啥不也在DATA段呢
作者: ppm10103    时间: 2013-05-04 12:29
明白了,数组是分配内存在堆栈段的,指针一般编译器不管指向的内存分配
作者: Frahm    时间: 2013-05-04 13:17
回复 5# ppm10103


    那个不能叫数组字面常量。那只不过是一种用字面常量来初始化数组的语法而已,就像char a[] = {...};还有你那个字面常量里不应该写\0,因为你用双引号就代表它是个字面常量,自动会\0结尾。
作者: 井蛙夏虫    时间: 2013-05-04 13:44
你确定程序是正常退出的,不是崩溃了。
pc指向的数据在只读数据段,*pc = 'a'写只读数据段内容应该会引起段错误的。
你用的是什么编译器,难道把数据分配在了可读写数据段?或者不是X86平台?
作者: pmerofc    时间: 2013-05-04 15:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: ppm10103    时间: 2013-05-07 14:35
多谢各位了,这个搞明白了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2