LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 863|回复: 4

C和C++不同的地方

[复制链接]
发表于 2004-9-21 16:40:36 | 显示全部楼层 |阅读模式
7.3.1 修改内容
        示例7-3-1中,字符数组a的容量是6个字符,其内容为hello\0。a的
内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态
存储区,内容为world\0),常量字符串的内容是不可以被修改的。从语法上
看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量
字符串的内容而导致运行错误。

  char a[] = “hello”;
  a[0] = ‘X’;
  cout << a << endl;
  char *p = “world”;     // 注意p指向常量字符串
  p[0] = ‘X’;                   // 编译器不能发现该错误
  cout << p << endl;
以上内容在C++中是这样的。但是对于C代码来说,以下程序完全的没有问题。
  char *p = “world”;   
  p[0] = ‘X’;
  printf("%s\n",p);
最后结果是 Xorld
发表于 2004-9-22 20:07:29 | 显示全部楼层

  1. 但是对于C代码来说,以下程序完全的没有问题。
  2. char *p = “world”;
  3. p[0] = ‘X’;
  4. printf("%s\n",p);
复制代码

楼主是从那里摘了一部分文章过来,无头无尾的,很容易被误解为“这段代码运行没有问题”,其实是说编译器不能发现这样的问题。
发表于 2004-9-23 10:48:16 | 显示全部楼层
呵呵,我还正在纳闷这样的代码怎么会没有问题
发表于 2004-9-24 07:56:58 | 显示全部楼层

我也这样想

我编译了一下,一运行它就说段错误,不过我看不出哪出.
发表于 2004-9-24 09:54:44 | 显示全部楼层
你用是gcc什么版本呀,我试了, 在C下根本就不行, “world”分配在全局的数据段中,任何修改的语句都会产生segment fault信号.代码如下:
#include <stdio.h>

int main(void)
{
        char *p = "world";
        p[0] = 'X';
        printf("%s\n",p);
        return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表