具有相åŒé™æ€å˜é‡å称的全局和本地如何存储在C内部存储器中?

时间:2018-03-03 10:54:39

标签: c

#include<stdio.h>
static int a=5;
main()
{
     static int a=15;
     printf("%d\n",a);
}

那么,两个å˜é‡a如何存储在内部存储器中?

具有相åŒå˜é‡å的全局å˜é‡å’Œå±€éƒ¨å˜é‡å¦‚何存储在内存中?

3 个答案:

答案 0 :(得分:1)

#include<stdio.h>
static int a=5;
int main()
{
    printf("%p\n",(void *)&a);
    static int a=15;
    printf("%p\n",(void *)&a);
    return 0;
}

上层程åºçš„输出是

0x564e6b67a030
0x564e6b67a034

因此,您å¯ä»¥çœ‹åˆ°ä¸¤è€…都存储在ä¸åŒçš„地å€ä¸­ã€‚因为一个是全局å˜é‡è€Œå¦ä¸€ä¸ªæ˜¯æœ¬åœ°å˜é‡ã€‚

答案 1 :(得分:1)

这些å称仅供人类读者感兴趣,编译器/链接器将该代ç è½¬æ¢ä¸ºæœºå™¨å¯æ‰§è¡Œä»£ç ã€‚最终目标代ç å°†è¿™äº›è§£æžä¸ºåœ°å€ï¼Œå称ä¸å†å­˜åœ¨ã€‚

编译器以åŒæ ·çš„æ–¹å¼åŒºåˆ†è¿™äº› - 按范围;当åŒä¸€å称空间中的两个相åŒç¬¦å·åŒæ—¶åœ¨èŒƒå›´å†…时,范围最大的符å·æ˜¯å¯è§çš„(å³å¯ä»¥é€šè¿‡å称访问)。

对于具有外部链接的符å·ï¼ˆåœ¨æ‚¨çš„示例中除了main之外没有其他符å·ï¼‰ï¼Œç¼–译器会ä¿ç•™ç¬¦å·å称以解æžå•ç‹¬ç¼–译的模å—之间的链接。在完全链接的å¯æ‰§è¡Œæ–‡ä»¶ä¸­ï¼Œç¬¦å·å称ä¸å†å­˜åœ¨ï¼ˆè°ƒè¯•æž„建符å·å…ƒæ•°æ®é™¤å¤–)。

答案 2 :(得分:0)

这个滑稽的答案是它们存放在ä¸åŒçš„地方。

请记ä½ï¼Œå˜é‡çš„å称ä¸ä¼šï¼ˆé€šå¸¸ï¼‰æž„æˆç¼–译程åºçš„一部分,因此编译器åªéµå¾ªå˜é‡ shadowing 的常规规则。所以在你的情况下你的print函数(顺便说一下,这ä¸æ˜¯æ ‡å‡†çš„C函数 - ä½ çš„æ„æ€æ˜¯printfå—?)输出a中声明的main 。您使用相åŒå称的事实根本ä¸ä¼šæ‰“扰编译器。

最åŽï¼Œåœ¨a mainé‡åˆ°å…¶ä»–声明时,C无法访问全局作用域static。extern。 (这ä¸æ˜¯é™æ€çš„,您å¯ä»¥ä½¿ç”¨python setup.py install 。)请å‚阅How can I access a shadowed global variable in C?