-
求教:为什么这一小段程序不能运行,想不通啊!
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 <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;
}
#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!
至于是否和编译器有关,高手详细解答以下