当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 15 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : c语言字符串声明赋值问题
帖子发表于 : 2012-03-20 14:44 
头像

注册: 2011-08-17 22:49
帖子: 96
送出感谢: 7
接收感谢: 1
我在主函数中声明了字符指针
代码:
char* filename="test.png";
但是编译的时候显示
代码:
warning: deprecated conversion from string constant to ‘char*’
意思大概是过时的用法,那请问正确的用法应该是?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-20 15:25 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: [email protected]
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
指向变量的指针指向常量。但通常这个都不会警告的,莫非编译器又更严格了。
代码:
const char* filename="test.png";


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。



_________________
评价: 3.7% 7rack
 
页首
 用户资料  
 
3 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-20 23:20 
头像

注册: 2011-08-17 22:49
帖子: 96
送出感谢: 7
接收感谢: 1
自由建客 写道:
指向变量的指针指向常量。但通常这个都不会警告的,莫非编译器又更严格了。
代码:
const char* filename="test.png";

谢谢你的回复,可能是这个原因吧


页首
 用户资料  
 
4 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-21 8:57 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
const位置不同。这是代码段的。

正规的字符串应该使用数组,然后strcpy。


_________________
● 鸣学


页首
 用户资料  
 
5 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-21 10:44 
头像

注册: 2011-08-17 22:49
帖子: 96
送出感谢: 7
接收感谢: 1
eexpress 写道:
const位置不同。这是代码段的。

正规的字符串应该使用数组,然后strcpy。

恕我愚笨,能举个简单的例子吗?


页首
 用户资料  
 
6 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-21 23:26 

注册: 2006-01-03 18:23
帖子: 152
送出感谢: 1
接收感谢: 5
const char * const s = "abcd";


_________________
以Wiki模式创建中文Linux文档,欢迎加入 http://linux-wiki.cn


页首
 用户资料  
 
7 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-21 23:36 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: [email protected]
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
引用:
正规的字符串应该使用数组,然后strcpy。


瞎说!什么正规不正规的,看需求!尽量用常量!


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-22 8:31 

注册: 2007-07-14 17:04
帖子: 624
送出感谢: 6
接收感谢: 3
指针是指向变量的,用它指向常量,编译系统担心它改变常量的值,这个同下面的这个道理应该是一样的
代码:
const int i=5;
int *t=&i;



_________________
评价: 3.7% 7rack
 
页首
 用户资料  
 
9 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-22 9:36 
头像

注册: 2010-04-02 16:44
帖子: 529
系统: openSUSE 13.2 x64
送出感谢: 2
接收感谢: 11
管这个警告干嘛,有时候这些写法是编程人员故意为之的,为的就是方便。你去编译一下boost就会发现其中有N多警告了


_________________
正在建设中的个人博客


页首
 用户资料  
 
10 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-22 10:20 

注册: 2006-01-03 18:23
帖子: 152
送出感谢: 1
接收感谢: 5
qgymib 写道:
管这个警告干嘛,有时候这些写法是编程人员故意为之的,为的就是方便。你去编译一下boost就会发现其中有N多警告了


忽略警告的前提是你清楚这样做的后果是什么。。。楼主的写法是很危险的,其实可能说明他不知道如下代码会崩溃。。。

代码:
char * p = "asdf";
int main() {
    p[0] = 'b';
}


_________________
以Wiki模式创建中文Linux文档,欢迎加入 http://linux-wiki.cn



_________________
评价: 3.7% 7rack
 
页首
 用户资料  
 
11 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-22 12:48 

注册: 2007-07-14 17:04
帖子: 624
送出感谢: 6
接收感谢: 3
楼上正解 :em01


页首
 用户资料  
 
12 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-23 10:57 
头像

注册: 2011-08-17 22:49
帖子: 96
送出感谢: 7
接收感谢: 1
我懂了 :em01 多谢各位,我在这里学了不少东西


页首
 用户资料  
 
13 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-23 11:32 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
自由建客 写道:
引用:
正规的字符串应该使用数组,然后strcpy。


瞎说!什么正规不正规的,看需求!尽量用常量!

你才瞎说。字符串在代码段的,不可修改的,能叫字符串?


_________________
● 鸣学


页首
 用户资料  
 
14 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-23 15:19 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: [email protected]
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
eexpress, 对你很无语!


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
15 楼 
 文章标题 : Re: c语言字符串声明赋值问题
帖子发表于 : 2012-03-24 11:09 

注册: 2011-10-22 6:52
帖子: 47
送出感谢: 0 次
接收感谢: 4
7rack 写道:
我在主函数中声明了字符指针
代码:
char* filename="test.png";
但是编译的时候显示
代码:
warning: deprecated conversion from string constant to ‘char*’
意思大概是过时的用法,那请问正确的用法应该是?


deprecated 这里的意思是反对的,不赞成的。

编译器在抗议你把一个常量指针转化成非常量指针。(这肯定是有问题的,因为常量指针意味着指向的对象不能被修改)

2楼给出的解决方法是正确的,在char*之前加上const就行,const char*。

"test.png" 是一个常量,编译的时候会被放在代码的数据段,如果你用gcc -S,就可以看到你c代码生成的相应的汇编码,我这里是放在“rodata”,说明是只读数据。

当你赋值的时候,const char* filename = "test.png”,你所得到的只是指向“test.png”这个常量的首地址。

对于常量的修改,其结果是未定义的。所以编译器在警告你。

如果你希望初始化一个可以被修改的字符串,应该这样写
char filename[] = "test.png";

这里编译器会为filename申请一块空间,并将字符串常量"test.png"拷贝到这个申请的空间内,所以修改filename这个字符串就是安全的了。



_________________
评价: 3.7% 7rack
 
页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 15 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译