2013-11-22 136 views
2

我在一個文件中定義了一個全局變量char buf[1024],可以在其他文件中聲明它的正確性是什麼? extern char buf[1024],extern char buf[]extern char *buf?我發現extern char buf[]作品和extern char *buf沒有,但想知道更多的解釋。全局char []變量,如何在其他文件中聲明它?

+0

看到一個非常詳細的解答在這裏:http://stackoverflow.com/a/1433387/694576 – alk

回答

4

您可以使用

extern char buf[]; 

extern char *buf; 

因爲數組不是指針

參考:C FAQ

+1

+1。數組不是指針 – haccks

+0

數組不是指針,有時除外。如:void foo(char array [100]){strcpy(array,「我真的是一個指針,即使我的聲明看起來像一個數組」); }' –

+0

不能使用相同語法的指針引用單維數組嗎? – anishsane

0

的extern炭BUF []和extern炭BUF [1024]兩者都OK。

在某些情況下,數組是通過指針實現的,例如在兩個函數之間傳遞參數。

0

當您將一個變量作爲extern時,您向編譯器指示變量的符號(地址)會在另一個.o文件中找到 - (這是在鏈接階段完成的)。

所以,當你是一個變量爲extern,你只需要提及的名字,因爲它會給有關地址的信息,不需要尺寸

0

這是數組和指針可以互換的老問題。數組和指針是不可互換的:它們恰好是大部分時間,因爲大多數情況下,在表達式中使用數組名稱時,它會衰減爲指針。

在Expert C Programming - Deep C Secrets中詳細解釋了在一個文件中定義char數組並在另一個文件中聲明爲char指針的特定情況。請參閱第4章。

數組的聲明爲您提供了一個數組,並且指針的聲明爲您提供了一個指針。不同之處在於數組是一個地址 - 第一個元素的地址 - 它不是一個可修改的l值,即它不能被分配給。另一方面,指針是一個保存地址的變量。

通常,上下文足以說明您是指變量的地址還是賦值中變量的內容。聲明

i = j;

是說給j內容存儲在i地址。在編譯器術語中,i被認爲是l值,而j是r值。編譯器必須生成代碼,將內存地址j的內容寫入內存地址i

考慮以下聲明:

char a[1024]; 
char *a; 

什麼,當你寫a[i] = j;會怎麼樣?

對於前一種情況,編譯器只會選擇地址a的內容,它在數組中是第一個元素的地址;規模爲i,並將其總和爲基地址。然後它將把地址的內容寫入j的地址。

對於後一種情況,那是相當不同:編譯器必須檢查其中a被存儲的存儲器位置,加載該存儲器位置的內容,以此作爲地址,並且寫入的j內容到該地址。

如果聲明中file1.c一個字符數組是這樣的:

char a[] = "Hello"; 

,然後定義,在file2

extern char *a; 

然後,在執行a[0] = 'x';file2.c會崩潰:因爲你告訴編譯器a是一個指針,它會檢查a值的存儲地址。實際上,這個地址持有'H'的字符代碼,但編譯器錯誤地將其解釋爲一個地址,並最終生成代碼,將'x'寫入地址'H',如果幸運的話,它會使您的程序崩潰分割違規。

因此,這是一個聲明和定義必須匹配的情況:如果您將其聲明爲一個數組,則將其定義爲一個數組;如果您將其聲明爲指針,請將其定義爲指針。您必須將buf聲明爲其他文件中的字符數組。下面這些形式是合法的,相當於:

extern char buf[1024]; 

extern char buf[];