免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc
打印 上一主题 下一主题

[C] 请教一个基础问题——数组名减1是否可以 [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
51 [报告]
发表于 2009-12-16 22:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
52 [报告]
发表于 2009-12-16 22:53 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
53 [报告]
发表于 2009-12-16 23:28 |只看该作者
这个还要看具体的环境吧,不同平台,栈增长方向不一样

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
54 [报告]
发表于 2009-12-17 00:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
55 [报告]
发表于 2009-12-17 09:09 |只看该作者
原帖由 pmerofc 于 2009-12-16 22:51 发表


我觉得还是就事论事的好
如果从语言本身出发就能说清楚的问题
没必要再扯上别的

“变量定义的位置和顺序就保证了其所在的位置”
不能同意

>>没必要再扯上别的
这样永远学不会C语言

>>“变量定义的位置和顺序就保证了其所在的位置”
>>不能同
不管你是否同意与否,事实就是如此。说的更明白些,给出一段程序,只要告知操作系统,硬件平台等信息,整个程序的内存是如何布局的都可以知道的一清二楚。
这样的C程序员才是合格的,他们真正了解自己的程序,就不会问出”数组名减1是否可以”、“为什么我的程序会segfault”之类的问题。
这些是光看两本语法书,光研究概念所学不到的

论坛徽章:
0
56 [报告]
发表于 2009-12-17 10:10 |只看该作者
int const 本意就是让你不要修改的意思,不知道我理解的对不对。


要这么说,函数名,结构体变量,你都+1 -1了。


不懂,我是来搅和一下的

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
57 [报告]
发表于 2009-12-17 10:15 |只看该作者
原帖由 zx_wing 于 2009-12-17 09:09 发表

不管你是否同意与否,事实就是如此。说的更明白些,给出一段程序,只要告知操作系统,硬件平台等信息,整个程序的内存是如何布局的都可以知道的一清二楚。
这样的C程序员才是合格的,他们真正了解自己的程序,就不会问出”数组名减1是否可以”、“为什么我的程序会segfault”之类的问题。
这些是光看两本语法书,光研究概念所学不到的


夸张了吧,如果编译器优化掉了某个变量呢?

论坛徽章:
0
58 [报告]
发表于 2009-12-17 11:11 |只看该作者
原帖由 zhaohongjian000 于 2009-12-17 10:15 发表


夸张了吧,如果编译器优化掉了某个变量呢?

不夸张的。
当你需要知道内存布局时,你必然会取地址,一旦取地址,这个变量就永远也不会被优化掉。
你就设想你在用C语言写操作系统,一个操作系统作者,如果连内存布局都不清楚,那是无法写的。
又比如做缓冲区溢出的攻击的hacker,就是因为知道程序的内存布局(或通过其他手段去探测),才能得手。

我说这些扯得远了。主要是为了反驳LZ认为C是个封闭的语言,觉得仅仅研究标准、研究语法就可以学好的思维。
光研究语言学学java倒还可以,学C是远远不够的。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
59 [报告]
发表于 2009-12-17 11:47 |只看该作者
当你需要知道内存布局时,你必然会取地址,一旦取地址,这个变量就永远也不会被优化掉。
你就设想你在用C语言写操作系统,一个操作系统作者,如果连内存布局都不清楚,那是无法写的。


-----------------------------------------------------------------------

怎么定义“内存布局”呢?一个函数栈内各个变量的分布很多情况下是不太确定的吧?当我想知道一个函数栈内变量如何分布的

时候,可以用调试器,也可以看汇编,不一定非得在原来的代码里加东西查看,而且加的东西影响了编译器的优化,等于还是

不知道在优化的情况下这几个变量是如何布局的。而说到操作系统的内存布局,那一般是指宏观上的“内存布局”吧,那些当然

都是可控的。


我觉得就这个问题,楼主其实是想从标准出发,确定这个做法是不是会有问题。个人认为,把指针指向数组第一个元素之前的

位置而不读写的话一般没有问题,虽然标准没有保证。就是不知道这种做法有什么好处。

论坛徽章:
0
60 [报告]
发表于 2009-12-17 12:40 |只看该作者
原帖由 zhaohongjian000 于 2009-12-17 11:47 发表
当你需要知道内存布局时,你必然会取地址,一旦取地址,这个变量就永远也不会被优化掉。
你就设想你在用C语言写操作系统,一个操作系统作者,如果连内存布局都不清楚,那是无法写的。


------------------ ...

这个帖子太长了。在33楼我就举了内核的例子来解释标准中的规定。
不继续回了,免得后来的同志光看了我一两个回复,没看到前面的所有回复误解我的意思,这就断章取义了。
感兴趣的话兄弟可以开个帖子继续讨论哈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP