我是C语言初学者,有个看似简单的问题,百思不得其解,特来请教

nail63547188 2009-04-24 08:54:59
程序1:
main()
{
int a=1;
int b=2;
int array[2]={3,4};
array[-2]=5;
array[-1]=6;
printf("%d,%d",a,b);
}
请分析上面这个程序的输出是什么,并说明为什么?如果,你认为你理解了程序1,那么请看程序2.

程序2:
main()
{
int a=1;
int b=2;
int array[2]={3,4};
array[-2]=5;
array[-1]=6;
printf("%u",&a);
printf("%d,%d",a,b);
}
程序2与程序1相比仅仅是多出了红色标记出来的那一行,请分析此程序的输出是什么,并说明为什么?
...全文
490 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
JonnyYoung 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhaoke7891 的回复:]
引用 12 楼 fengcman 的回复:
麻烦楼主出这种题目前先给出个平台。这无非就是对系统堆栈的理解


下面的代码在VC6.0下的执行结果:
C/C++ code#include<stdio.h>voidmain()
{inta=1;intb=2;intarray[2]={3,4};
array[2]=5;
array[3]=6;

printf("%d, %d\n", a, b);

printf("%u\n",&a);
printf("%u\n",&b);
printf("%u\n",array);
printf("%u\n",&array[0]);
printf("%u\n…
[/Quote]
正解,其实这是编译器在处理内存分配时的机制问题,我在MingGW下也得到类似的结果:

a: 2293620
b: 2293616

array[0]: 2293608
array[1]: 2293612
array[-1]: 2293604
array[-2]: 2293600
array[2]: 2293616
array[3]: 2293620

1,2
byx2009 2009-05-09
  • 打赏
  • 举报
回复
看不懂……初学者!!
逆风向前进 2009-05-08
  • 打赏
  • 举报
回复
378141081,2请按任意键继续. . .

37814108(这里没用换行分开)1,2请按任意键继续. . .
WizardOz 2009-05-07
  • 打赏
  • 举报
回复
第一个就没有搞清楚,不知道这些东西有没有一个规范。
Linux校园社区 2009-05-07
  • 打赏
  • 举报
回复
我也想冒充下楼主。。
wcq412 2009-05-06
  • 打赏
  • 举报
回复
学习了
yeliangang 2009-05-05
  • 打赏
  • 举报
回复
这种操作在之后的很多编译器都禁止了,而且没有这么操作的理由,因为根本无法确定array[-1],array[-2]指向的什么内容,不过比较通常的情况下应该是array[0]之前的内存内容。
jjcrazy 2009-05-05
  • 打赏
  • 举报
回复
学习了, 根据编译器的原理
但是LZ写得就不规范了
smillyz 2009-05-05
  • 打赏
  • 举报
回复
这种代码在运行时难道没有警告吗!数组的下标怎么可以有不在定义范围里的值呢!其中所说的内存和寄存器方面的知识,既然是初学者基础知识没有学好,怎么去可能明白那些方面的知识呢!其中有关寄存器寻址的内容是《微型计算机原理和接口技术》中有所讲的,上网上可以查查学好这么课是需要很好的前序课程的,比方说C语言。有些东西不是仅仅需要努力就行的!
学习的时候弄明白自己要掌握的内容是什么,对于一些没有必要深究的东西,研究了只是本末倒置而以,(个人的见解)
lidaq2007 2009-05-05
  • 打赏
  • 举报
回复
感觉这么用不安全
fengcman 2009-05-05
  • 打赏
  • 举报
回复
我真的不知道楼主在说些什么,寄存器的分配更关系到程序的运行效率,就像你在写汇编代码是对寄存器的运用是多么的重要,跟这个有实质的影响吗??这个应该是编译器对语法的解释不同,造成的结果差异
rjianfeili 2009-05-05
  • 打赏
  • 举报
回复
UP
qq675927952 2009-05-03
  • 打赏
  • 举报
回复
难啊,up下LZ
nail63547188 2009-04-29
  • 打赏
  • 举报
回复
我是楼主,我的目标变成了,去搞清楚turboc2.0中的编译器所采取的寄存器分配策略是什么?
nail63547188 2009-04-29
  • 打赏
  • 举报
回复
我是楼主,原本以为我已经理解那两个问题了,但是通过做实验,却发现我并没有理解。这个问题的实质涉及到寄存器分配。寄存器分配是编译中一个重要的课题。所谓的寄存器分配就是编译器选择哪些变量作为寄存器变量,也就是选择为哪些变量分配寄存器,而不是内存空间。存在好多寄存器分配算法,用于选择寄存器变量的。以我目前的能力,我离最终搞清楚这个问题还有好多路要走。我的最终目的是理解某编译器中所采用的寄存器分配算法(或策略)。对于这个问题的理解,只能是编译方面的高手才能给于解答了,而且不同的编译器所采用的算法或策略,也是不同的。
Paradin 2009-04-29
  • 打赏
  • 举报
回复
a[-2] = -2[a] = *(a + (-1)) = *(a - 2)
ckc 2009-04-29
  • 打赏
  • 举报
回复
这种题目说难听点就是“回字的四种写法”
如果经验丰富,水到渠成知道“回字的四种写法”,那就是个高手
如果刻意去了解“回字的四种写法”,那就是孔乙己

数组的下标实际上就是相对于基地址的偏移量
比如array的基地址是10000
那么array[0]的地址也是10000
假定编译器编译出来的int每个4字节
那么array[1]的地址就是10004
array[-1]的地址是9996
程序中只定义了array[2],也就是0和1这两个是合法地址,使用其它地址是非常不规范的行为
就象程序1,并没有规定要求分配地址的时候一定要按照a,b,array这样的顺序来分配
yyt_yang 2009-04-29
  • 打赏
  • 举报
回复
代码这样子是不安全的,数组使用内存溢出赋值,如果数组前面没有int a和int b,再或者变量ab和数组的定义类型不一样,那就会是另外一种结构,当然楼上有人提到在不同系统平台也会参数不同的结果,这个也要参考。
plumsure 2009-04-29
  • 打赏
  • 举报
回复
&就是地址,没有什么特殊之处啊
hanyingmenghuan 2009-04-28
  • 打赏
  • 举报
回复
我网络工程,编译原理和体系结构学校不开,我无语...
数组的下标居然还可以是负数,今天开眼见了,
不晓得哪位大侠肯讲解下,用负数有些什么规则
加载更多回复(14)

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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