我在一個文件中定義了一個全局變量char buf[1024]
,可以在其他文件中聲明它的正確性是什麼? extern char buf[1024]
,extern char buf[]
或extern char *buf
?我發現extern char buf[]
作品和extern char *buf
沒有,但想知道更多的解釋。全局char []變量,如何在其他文件中聲明它?
回答
的extern炭BUF []和extern炭BUF [1024]兩者都OK。
在某些情況下,數組是通過指針實現的,例如在兩個函數之間傳遞參數。
當您將一個變量作爲extern時,您向編譯器指示變量的符號(地址)會在另一個.o文件中找到 - (這是在鏈接階段完成的)。
所以,當你是一個變量爲extern,你只需要提及的名字,因爲它會給有關地址的信息,不需要尺寸
這是數組和指針可以互換的老問題。數組和指針是不可互換的:它們恰好是大部分時間,因爲大多數情況下,在表達式中使用數組名稱時,它會衰減爲指針。
在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[];
- 1. 如何使用其他局部變量聲明局部變量?
- 2. 在全局頭文件中聲明一個全局變量?
- 3. 如何聲明全局變量其中僅使用在PROC
- 4. 在QML中爲其他QML文件聲明全局屬性
- 5. 聲明全局變量
- 6. 全局變量聲明
- 7. JavaScript;我如何聲明變量全局?
- 8. 如何聲明全局變量?
- 9. 如何聲明全局變量
- 10. 如何正確聲明全局變量?
- 11. 在Arduino中聲明全局變量
- 12. 在perl中聲明全局變量
- 13. 在ActionScript中聲明全局變量?
- 14. 在Matlab中聲明全局變量
- 15. 在coffescript中聲明全局變量
- 16. 在yacc中聲明全局變量
- 17. 全局變量在android中的聲明
- 18. 在Java中聲明全局變量
- 19. 在全局變量中聲明查詢
- 20. 在Python中聲明全局變量類
- 21. 在Swift中聲明全局變量
- 22. 在vb中聲明全局變量
- 23. 如何在源文件中使用頭文件中聲明的全局變量?
- 24. 如何聲明全局變量來訪問vba中的其他函數?
- 25. C++ - 好的在.h文件中聲明靜態全局變量?
- 26. SWIG不會在wrap文件中聲明全局變量
- 27. 我們可以在QML文件中聲明全局變量嗎?
- 28. Eclipse:未明確聲明全局變量
- 29. proc聲明中的Tcl全局變量
- 30. 聲明Button1_Click中的全局變量
看到一個非常詳細的解答在這裏:http://stackoverflow.com/a/1433387/694576 – alk