是å¦ä¸ºæ•°ç»„å˜é‡åˆ†é…内存以存储数组中第一个元素的地å€ï¼Ÿ

时间:2018-01-21 07:46:43

标签: c pointers memory-address

void func()
{
   int arr[5]={1,2,3,4,5};
   int variable = arr[1];       //variable will be set to 2
}

当执行该程åºæ—¶ï¼Œå°†åœ¨è™šæ‹Ÿåœ°å€ç©ºé—´çš„堆栈区域中分é…相当于5个整数的连续内存,如下所示为5个整数的数组。

   +---+
   |   | a[0]
   +---+ 
   |   | a[1]
   +---+
   |   | a[2]
   +---+
   |   | a[3]
   +---+
   |   | a[4]
   +---+

在数组å˜é‡arr 本身分é…的虚拟地å€ç©ºé—´ï¼ˆä»£ç /æ•°æ®/堆栈/堆段)中是å¦æœ‰ç©ºæ ¼è€Œä¸æ˜¯5个整数数组?

如果未分é…,则

考虑代ç ç‰‡æ®µ - int variable = arr[1];,它将由编译器转æ¢ä¸º*(arr+1),并将出现在地å€ç©ºé—´çš„代ç æ®µä¸­ï¼Œå³åªè¯»ã€‚

在æ¯ä¸ªå‡½æ•°è°ƒç”¨arr期间,arr如何计算到数组func的起始地å€ï¼Ÿç”±äºŽæ¯æ¬¡è°ƒç”¨è¯¥å‡½æ•°æ—¶ï¼Œè°ƒç”¨å †æ ˆçš„地å€éƒ½å¯èƒ½å‘生å˜åŒ–,因此数组arr的地å€ä¹Ÿä¼šå‘生å˜åŒ–。 因此,如果没有为数组å˜é‡arræä¾›å•ç‹¬çš„空间,那么如何实现呢?

2 个答案:

答案 0 :(得分:1)

  

在æ¯ä¸ªå‡½æ•°è°ƒç”¨arr期间,arr如何计算到数组func的起始地å€ï¼Ÿ

在x86架构上的典型实现中,arrçš„ä½ç½®å°†å–决于堆栈指针(esp)或帧指针(ebp),å³ï¼šå®ƒå°†é€šè¿‡åº”用固定å移é‡æŒ‰ç…§å…¶ä¸­ä¸€ä¸ªæŒ‡é’ˆå¯„存器进行定义。

对func()çš„æ¯æ¬¡è°ƒç”¨å¯èƒ½æœ‰æ‰€ä¸åŒçš„是这些指针寄存器的值,而ä¸å¦‚何定义arr的术语那些(å³ï¼šå›ºå®šçš„å移é‡ï¼‰ã€‚

答案 1 :(得分:0)

在编译器构造中有一个å«åšç¬¦å·è¡¨çš„东西。符å·è¡¨å­˜å‚¨å称arr和地å€ï¼ˆå¯ä»¥æ˜¯åŸºäºŽè¿›ç¨‹çš„地å€ç©ºé—´çš„å移é‡ï¼‰ã€‚然åŽï¼Œåªè¦ç¼–译器看到此arr[1],它就会生æˆå¿…è¦çš„汇编代ç ï¼Œä»¥ä¾¿ä»ŽMOV表示的内存地å€ä¸­èŽ·å–LOAD或*(arr+1)指令。 +1的算法由编译器确定它指å‘的类型æ¥å®Œæˆã€‚符å·è¡¨ç”¨äºŽä¿å­˜å˜é‡çš„内存地å€ä¿¡æ¯ã€‚ (例如: - 在函数的情况下,分é…给它的堆栈帧决定了我们用arrçš„å称指定的连续内存的起始地å€æ˜¯ä»€ä¹ˆ - 这就是为什么它会也å¯ä»¥æ”¹å˜ï¼Œå› ä¸ºåˆ†é…ç»™æŸä¸ªåŠŸèƒ½çš„内存在æ¯æ¬¡è°ƒç”¨æ—¶éƒ½ä¼šæœ‰æ‰€ä¸åŒã€‚)