字符串问题

linwendong1982 2011-04-20 09:10:43
char* 指向一个中文字符串总是编译错误C2001:newline in constant
例如 char* p = "你好";
...全文
247 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
swordsman 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 verycctv 的回复:]
引用 22 楼 guojiangtao2 的回复:

14楼说的对:
谢谢你的评论:早上由于在思考Malloc是怎么实现的,看到你的问题就回复了,由于不慎可能给你带来困惑,在这里给你说一声对不起,下面是我的解释:

char *p="你好";的时候,它会在数据段为指针P开辟一段空间,一般情况下是连续的,此时P相当于指针常量,在运行过程中是不会改变的,这时候的指针就退化为数组,相当于cha……
[/Quote]
======
appadm@xpangxie:~$ uname -a
Linux xpangxie 2.6.26-2-686 #1 SMP Sat Nov 20 23:06:30 UTC 2010 i686 GNU/Linux
appadm@xpangxie:~$ cat test.c
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
int main(){
char *p="hello";
printf("%s\n",p);
p="hello_test";
printf("%s\n",p);
return 0;
}
appadm@xpangxie:~$ ./test
hello
hello_test
appadm@xpangxie:~$
======
大侠,可以对指针p重新赋值呀。请参考上面的程序,我执行的结果可能跟你说的不一致,请你确认一下。
meditator_bi 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 guojiangtao2 的回复:]

14楼说的对:
谢谢你的评论:早上由于在思考Malloc是怎么实现的,看到你的问题就回复了,由于不慎可能给你带来困惑,在这里给你说一声对不起,下面是我的解释:

char *p="你好";的时候,它会在数据段为指针P开辟一段空间,一般情况下是连续的,此时P相当于指针常量,在运行过程中是不会改变的,这时候的指针就退化为数组,相当于char p[]="你好";
char *p=(ch……
[/Quote]

再好好理解理解。
char *p = "你好" //"你好"这个字符串在编译期已经在常量区分配了地址,该语句执行完后,*p指向这个首地址。p虽然不是const类型,但是如果对*p重新赋值就是改变常量区内容,运行时崩溃。
meditator_bi 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guojiangtao2 的回复:]

有些编译器是可以通过编译的,对于一个指针类型的P,它是一个野指针,没有指向,也没有自己的空间;

我认为:
应该先给指针开辟空间,然后在使用;
char *p=(char *)malloc(sizeof(char)*10);
p="你好";
这样才合法,在指针开辟完空间以后,它会返回首地址给p,这样它就不会在报错了!
[/Quote]

执行完两条语句后p指向堆上分配的那块内存?"你好"这个字符串拷贝过去了?
这样做除了造成一段内存泄漏,跟楼主的做法没有任何不同
如此美丽的你 2011-04-21
  • 打赏
  • 举报
回复
6楼基础不扎实
screwzm 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wenxian8 的回复:]
这 很明显都猜到了: 分号,或者双引号 在中文状态下书写的。

否则 还能错在哪里呢。
[/Quote]
++
想法一致!
guojiangtao2 2011-04-21
  • 打赏
  • 举报
回复
char *p = "你好" //"你好"这个字符串在编译期已经在常量区分配了地址,该语句执行完后,*p指向这个首地址。p虽然不是const类型,但是如果对*p重新赋值就是改变常量区内容,运行时崩溃。

这个问题,我在5年前就知道了,那时候在调试代码的时候发现的!
firefoxbug 2011-04-21
  • 打赏
  • 举报
回复
32++
zhangzhengmin 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 ileson 的回复:]
#include <stdio.h>
void main(){
char * p="中国";
printf("%s",p);
getche();
}
打出来是乱码。。。。
[/Quote]

你编译器的问题吧~!
Leson_Yin 2011-04-20
  • 打赏
  • 举报
回复
#include <stdio.h>
void main(){
char * p="中国";
printf("%s",p);
getche();
}
打出来是乱码。。。。
huaxiamoyun 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guojiangtao2 的回复:]
有些编译器是可以通过编译的,对于一个指针类型的P,它是一个野指针,没有指向,也没有自己的空间;

我认为:
应该先给指针开辟空间,然后在使用;
char *p=(char *)malloc(sizeof(char)*10);
p="你好";
这样才合法,在指针开辟完空间以后,它会返回首地址给p,这样它就不会在报错了!
[/Quote]赞成 赞成
zhangzhengmin 2011-04-20
  • 打赏
  • 举报
回复
真的惊动了不少的人
staticabc 2011-04-20
  • 打赏
  • 举报
回复
#include <stdio.h>
int main(){
char *p="hello";
printf("%s\n",p);
return 0;
}

你多加了个‘*’吧
风暴之怒 2011-04-20
  • 打赏
  • 举报
回复
分号错了
AnYidan 2011-04-20
  • 打赏
  • 举报
回复
别的错误引起的
aa_niaofang 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guojiangtao2 的回复:]

有些编译器是可以通过编译的,对于一个指针类型的P,它是一个野指针,没有指向,也没有自己的空间;

我认为:
应该先给指针开辟空间,然后在使用;
char *p=(char *)malloc(sizeof(char)*10);
p="你好";
这样才合法,在指针开辟完空间以后,它会返回首地址给p,这样它就不会在报错了!
[/Quote]

你这个把p指针本来的空间丢掉了,char *p="你好";本来就是让p指向一个常量空间。
向你这样 每次都这样得浪费多少空间?不得不说你基础还是没学好
aa_niaofang 2011-04-20
  • 打赏
  • 举报
回复
注意是否引号错了
aa_niaofang 2011-04-20
  • 打赏
  • 举报
回复
6楼无敌了
delphiwcdj 2011-04-20
  • 打赏
  • 举报
回复
这么奇怪
linwendong1982 2011-04-20
  • 打赏
  • 举报
回复
是的
[Quote=引用 9 楼 shrek_mycpp 的回复:]
你的分号和引号 是ANSI字符么?
[/Quote]
Shrek_MyCpp 2011-04-20
  • 打赏
  • 举报
回复
你的分号和引号 是ANSI字符么?
加载更多回复(16)

70,037

社区成员

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

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