/*
* d.c
*
* Created on: Nov 15, 2011
* Author: root
*/
#include "apue.h"
int a[] = {3,2};
void hello()
{
printf("d.c %d",a);
}
/*
============================================================================
Name : hello.c
Author :
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include "apue.h"
extern void hello();
extern int *a;
int main(void)
{
hello();
printf("\n : %d",a);
return EXIT_SUCCESS;
}
上面的代碼的輸出為
d.c 134520856
: 3
第一行代碼是第一個檔案d.c輸出了int a[];a的內容
第二行代碼是第二個檔案hello.c輸出了extern int *a;指標a的內容
gcc編譯的時候,在連結階段了,hello.o有extern a符號,在d.o中找到,所以extern a 和d.o的a是同一個符號(我認為稱他們“指向相同”有歧義)
也可以用映像表示
。數組第一項在記憶體位址134520856處。
第一個檔案d.c將a當成數組來處理,可以按照想象的進行輸出,但是
但是第二個檔案是把符號a當成指標來操作的(因為 extern int *a), 指標所在的地址是134520856,但是指標的值是3(理解嗎?)。
如果將hello.c改成下面這樣
#include "apue.h"
extern void hello();
extern int *a;
int main(void)
{
hello();
printf("\n : %d",a[1]); // 這裡被修改了
return EXIT_SUCCESS;
}
在main函數中,按照編譯器的規矩,a[1]可以被我們這樣認為 *(a+1);
因為a等於3,a+1等於4,*(a+1)的意思就是取記憶體位址為4的位元組內容,我不知道地址為4的那個位元組裡面是什麼東西。但是起碼不是我們想要的。
轉載請註明出處:http://www.cnblogs.com/stonehat/archive/2011/11/15/2250091.html
二、再看下面的代碼。
// file : d.c
#include "apue.h"
int *a;
void hello()
{
a =(int *) malloc(2);
a[0]=3;
a[1]=2;
printf("d.c %d",a);
}
// file : hello.c
#include "apue.h"
extern void hello();
extern int *a;
int main(void)
{
hello();
printf("\n : %d",a);
return EXIT_SUCCESS;
}
輸出結果:
d.c 161968136
: 161968136
我說了實際上 只要是extern a就表示這兩個a符號,實際上是同一個符號a,(你可以將兩個檔案的函數輸出&a,就會發現他們的地址是一樣的)。
這種情況下的記憶體配置是這樣的。
如果main函數改成這樣的,就是輸出a[1]的值,
int main(void)
{
hello();
printf("\n : %d",a[1]);
return EXIT_SUCCESS;
}
按照規矩,輸出*(a+1),a等於161968136, 加1,就等於161968140(懂?),就會輸出2.
三、再看一種情況。
// d.c
#include "apue.h"
int *a;
void hello()
{
a =(int *) malloc(2);
a[0]=3;
a[1]=2;
printf("d.c value:%d\n",a);
printf("d.c address:%d\n",&a);
}
// hello.c
extern void hello();
extern int a[];
int main(void)
{
hello();
printf("hello.c value:%d\n",a);
printf("hello.c address:%d\n",&a);
printf("hello.c a[1]",a[1]);
return EXIT_SUCCESS;
}
輸出結果為:
d.c value:160223240
d.c address:134520864
hello.c value:134520864
hello.c address:134520864
hello.c a[1]
記憶體分布圖為:
在hello.c中,a被當成int a[];
a的值為160223240, *(a+1),就能夠訪問到2.
轉載請註明出處:http://www.cnblogs.com/stonehat/archive/2011/11/15/2250091.html