2011-11-23 84 views
0

如果我有兩個數組喜歡這樣的:如何判斷多維數組是否未分配給?

short** x; 
short** y = functionThatReturnsAnArray(); 

在這種情況下sizeof(x) == sizeof(y)。 都是4,我相信這是因爲外部數組只是一個指針數組,因此實際上並沒有分配給它的任何RAM。

我如何知道x沒有被賦值?

謝謝,

+3

定義「空」。 – delnan

+0

在你的情況下,'x'和'y'的大小將始終爲'4',即使它們有分配給它們的內存,因爲sizeof'只返回其參數的大小,並且指針的大小始終'4'(在你的情況下),無論它指向什麼。 –

+0

delnan - 未分配給 – JoeS

回答

2

從你的原始文章中的評論,你的意思是你是否可以知道一個值是否被賦值給一個變量。我們稱初始化爲。當一個值沒有被存儲到一個變量中時,它是未初始化的,這很糟糕,因爲你永遠不知道它裏面可能存在什麼,不,你不能檢查它是否已經被初始化,所以當你聲明時初始化它。


sizeof(x) == sizeof(y)因爲他們聲明爲同一類型(short**);它們的內容無關緊要(sizeof實際上是由編譯器決定的,所以它通常無法知道它裏面的內容)。

如果你想知道一個存儲區,每個點都是零,你需要做手工(和你需要知道每個數組有多長):

int x_empty = 1; 

for(int i = 0; i < x_length_d1 && x_empty; i++) { 
    if(x[i] == NULL) { 
     // Handle a missing row however you want. 
    } 
    for(int j = 0; j < x_length_d2 && x_empty; j++) { 
     if(x[i][j] != 0) x_empty = 0; 
    } 
} 
+0

+1用於澄清術語,超出此問題的範圍非常有用。 – delnan

2

sizeof返回short**的大小(指針指向短),其似乎是在系統中的4個字節。如果你分配內存,你應該知道你分配了多少個字節,並且傳遞這個值。

例如:

size_t size_allocated = 0; 
short** y = functionThatReturnsAnArray(&size_allocated); 

short ** functionThatReturnsAnArray(size_t * size) { 
    short ** buff; 
    size_t size_to_allocate = 5 * sizeof(short *); 
    buff = malloc(size_to_allocate); 
    if (!buff) { 
     *size = size_to_allocate; 
    } 
    else { 
     *size = 0; 
    } 
    return buff; 
} 
2

不能檢查,如果一個變量已被分配到。未初始化的變量的值是未定義的IIRC。根據Assigning pointer to uninitialized variable changes it value?(由Seth Carnegie發現),即使訪問它也會導致未定義的行爲。

解決方案?顯式指定一個標記值並檢查它。對於指針來說,NULL通常是有意義的。

+0

看一個未分配變量的值不是UB嗎? –

+0

@SethCarnegie:正如我所指出的,我不是100%確定的。參考將是很好的。也許這只是我的一個混淆術語?如果標準保證了未初始化(local,non-'static)變量的值,但是它可能不符合UB的確切定義,我會非常驚訝。 – delnan

+1

不,它絕對不能保證未初始化變量的值,但顯然你是對的,它被稱爲UB根據http://stackoverflow.com/q/7468166/726361,這是由我信任的Als寫的關於這樣的事情。我認爲這將是實現定義的行爲,但顯然不是。 +1 –

相關問題