2012-04-18 78 views
0

如果我在函數中有以下代碼,我將不會收到錯誤,並且我可以編譯沒有問題,但是,一旦將它放入全局範圍,我將得到「無法分配大小爲零的數組」的錯誤以及其他幾個錯誤。爲什麼會發生這種情況,我該如何擺脫這些錯誤。我意識到全局變量的風險,這只是一個簡單的測試案例。爲什麼我無法在全局範圍內訪問我的數組下標

int* intest[2]; 
intest[0] = new int; 

回答

1

您被允許在全局範圍內聲明但不允許使用新操作符或賦值。因此,您需要在全局範圍內聲明int * intest [2](並且您的所有代碼都會看到它),但C++需要新代碼位於主代碼的序列中。 (可能是某種啓動應用程序的功能)。

編輯:正如@phresnel指出的,你可以在這個範圍內使用新的操作符,但不能賦值(這是不常見的,但不是非法的)。但是作爲啓動會爲你工作了以下新的運營商:

int *x[2]={new int,new int}; 

一般使用這樣的全球性緩衝的強烈勸阻,被認爲是一個反模式 - 如果你能避免使用它,你可能應該。

+0

這很奇怪,爲什麼我不能在全局變量上使用新的或賦值? – judeclarke 2012-04-18 08:03:21

+1

@judeclarke:這只是爲了保持一點理智。如果您可以將常規語句放在命名空間範圍中,那麼考慮單獨編譯,它們將按照什麼順序執行?這就是初始化的問題,稱爲「全局初始化失敗」。因爲你*可以*放置有任何效果的表達式,因爲初始化器......這與C++缺乏適當的模塊有關。 – 2012-04-18 08:09:25

+1

-1:當然你可以在全局範圍內使用'new'和賦值。例如:'int * x,* y = x = new int; int main(){} – 2012-04-18 08:20:02

0

AFAIK,全球範圍只允許你把definedeclaration就可以了。然而intest[0] = new int;是編譯時c/C++編譯器會失敗的一項任務。

+0

爲什麼這不被允許? – judeclarke 2012-04-18 08:09:00

+0

這是C/C++規則。 c/C++不是從第一行代碼執行到最後一行代碼的腳本語言,但是每個執行代碼都應該停留在方法中,並從方法** main **開始。 – Sylvester 2012-04-30 09:36:31

1
int* intest[2]; 

卻在局部範圍內有效配售:

intest[0] = new int; 

不是。

不同之處在於,上面的一個是初始化語句(創建變量),而下面的一個是執行代碼段的

代碼應該是「執行」不能在全局範圍內調用,例如,你不能在全局範圍內調用一個函數。何時會調用該功能?

我可以在全局範圍內創建多少個變量,但是我不能從初始化全局變量時調用構造函數以外的代碼。

如果要執行的代碼,如:

intest[0] = new int; 

你將不得不執行它主要槽或其他功能,否則程序將不知道執行它。

+0

你明白我的意思嗎? – David 2012-04-18 08:51:48

相關問題