【zz】求教:为什么这一小段程序不能运行,想不通啊!

c/c++笔面应用实战 专栏收录该内容
101 篇文章 70 订阅 ¥29.90 ¥99.00

求教:为什么这一小段程序不能运行,想不通啊!  http://www.programfan.com/CLUB/archives/146/145023.html
发帖人:maddrone 发帖时间:2006-3-4 15:41:00
#include <stdio.h>
int main(void){
    char *string="I love China!";
    puts(string);
    putchar('/n');
    (*string)='u';
    puts(string);
    return 0;
    
    }


可以编译通过,但在对(*string)赋值的时候就会出错,想不通啊
回复人: GBS 回复时间:2006-3-4 15:45:00
程序好像不能对*string重新赋值吧?
回复人: maddrone 回复时间:2006-3-4 15:53:00
为什么?
不相当于对字符数组的第一个元素重新赋值吗?
回复人: maddrone 回复时间:2006-3-4 16:06:00
高手帮忙看看啊
回复人: tianyuan008 回复时间:2006-3-4 16:22:00

和你的编译器有关

C 标准并没有规定不能这么做,不过很多编译器不允许这样做.

很多编译器把 char *string="I love China" 视为指针指向常量,当然不能修改常量.


回复人: ytud 回复时间:2006-3-4 16:27:00
(*string)='u';为什么加括号啊
回复人: maddrone 回复时间:2006-3-4 16:33:00
我也觉得应该是编译器问题,我用的是gcc,老是不能对*string赋值
ytud,我没办法了才加了().......
回复人: tianyuan008 回复时间:2006-3-4 16:56:00

用数组吧,

char string[]="...";
回复人: idealistic33 回复时间:2006-3-4 18:13:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    char *string = (char *)malloc(20 * sizeof(char));
    strcpy(string, "I love China!");

    puts(string);
    putchar('/n');
    (*string)='u';
    puts(string);
    return 0;   
}
回复人: mwjpiero 回复时间:2006-3-4 18:21:00
C标准不允许改变字符串里面的值
回复人: maddrone 回复时间:2006-3-4 18:56:00
请问idealistic33

也就是说只有在给string开辟了空间
string所指向的字符串才是可以修改的
不然的话 string所指向的字符串就是静态的 不可以被修改的
请问这是c标准吗?
但我看潭好强书上的例子
有像我源程序那样的例子
麻烦你把这个知识点帮我解释下可以吗?
回复人: zyw358486 回复时间:2006-3-4 19:10:00
引用
#include&nbsp;<stdio.h>
#include&nbsp;<stdlib.h>
#include&nbsp;<string.h>

int&nbsp;main(void){
&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*string&nbsp;=&nbsp;(char&nbsp;*)malloc(20&nbsp;*&nbsp;sizeof(char));
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(string,&nbsp;"I&nbsp;love&nbsp;China!");
&nbsp;&nbsp;&nbsp;&nbsp;puts(string);
&nbsp;&nbsp;&nbsp;&nbsp;putchar('/n');
&nbsp;&nbsp;&nbsp;&nbsp;(*string)='u';
&nbsp;&nbsp;&nbsp;&nbsp;puts(string);
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;&nbsp;&nbsp;
}


#include <stdlib.h>
具体有什么做用啊?
我只知道//定义杂项函数及内存分配函数?
但是具体干什么我还是有知道?
回复人: idealistic33 回复时间:2006-3-4 19:12:00

char a[] = "hello";
a[0] = ‘X’;
char *p = "world"; // 注意p指向常量字符串
p[0] = 'x'; // 错误,但编译器不能发现该错误

 
字符数组a的容量是6个字符,其内容为hello/0。a的内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态存储区,内容为world/0),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量字符串的内容而导致运行错误。

char *p = (char *)malloc(sizeof(char) * 100); //p指向新分配的存储空间,可以通过指针修改其内容
strcpy(p, "world");
p[0] = 'x'; //这样就是对的
回复人: maddrone 回复时间:2006-3-4 19:27:00
请高手帮我指点指点

是不是类似于 char *string=".....",
这样就不能利用string指针改变字符串的值了啊
C标准是怎样的呢
回复人: maddrone 回复时间:2006-3-4 19:33:00
idealistic33

我记住你了
以后多多指教啊!!太感谢了
解答了我多天的疑惑
回复人: eagleking0000 回复时间:2006-3-4 21:35:00
没错啊,能运行通过. 我用的是win-tc
(*string)='u';//给指针的首地址赋值 
#include <stdio.h>
int main(void){
    char *string="I love China!";
    puts(string);
    putchar('/n');
    (*string)='u';
    puts(string);

    
   getch();
      return 0;
    }
显示结果:I love china!
         u love china!
回复人: 冉爱代 回复时间:2006-3-5 2:17:00
明明有工具.. 自己不用..真傻...
回复人: qiuyishuaige 回复时间:2006-3-5 9:40:00
*string是指向字符串第一个字符,运行完puts(string);后指向系统自动加的'/0'字符。
   要重新赋值,不能对指针变量*string赋值。
  要的话只能让*string指向定义的字符'u'.
#include <stdio.h>
int main(void){
    char *string="I love China!";
    puts(string);
    putchar('/n');
    string="u";
    puts(string);
    getch();
    }
回复人: maddrone 回复时间:2006-3-5 9:50:00
qiuyishuaige

puts()函数还能改变string所指向的地址???
我对你的话深表怀疑
你能不能再给我解释一下
回复人: maddrone 回复时间:2006-3-5 9:51:00
冉爱代

你说我真傻吗
但linux下都是用gcc
gcc不好吗
但我以后要在linux下不是只能用gcc吗?
回复人: qiuyishuaige 回复时间:2006-3-5 10:01:00
呵呵,我那是重新赋值。
    其实楼主的程序是对的,从新让string指向字符串"u".然后输出。
  开始没看到第2页的回复,不知道楼主要的是"u love china!".呵呵,我的结果只是输出:u
回复人: tianyuan008 回复时间:2006-3-5 15:42:00
晕,还要我说几遍?

这是 C 标准的未定义情形!!!
也就是说, C 标准把这个问题留给具体编译器去处理.换言之,
这样写:

char * str="abcde";
str[1]='r';

并不违反 C 标准!!! 举个例来说, VC++2005 带上/za 编译选项( 也就是 ANSI/ISO 95 C 标准)后是可以这样做的!!!但在VC 6 中就不允许这样做.

允不允许这样做只是具体编译器的自定义行为,和 C 标准无关!!! 

从这个角度说, 9 楼,12 楼的解释是错的.

C 标准相当于国家制定的法律法规, 各个编译器在 C 标准的基础上制定自己的"地方法规",楼主的程序并不违反"国家法规",但违反了"地方法规".


回复人: gzy407 回复时间:2006-3-5 15:51:00
5楼说的问题其实不加括号也可以。不信你试试!
回复人: ren19850322 回复时间:2006-3-5 22:43:00
我用wintc 运行结果:
i love China!

u love China!

至于是否和编译器有关,高手详细解答以下

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值