如果我有兩個數組喜歡這樣的:如何判斷多維數組是否未分配給?
short** x;
short** y = functionThatReturnsAnArray();
在這種情況下sizeof(x) == sizeof(y)
。 都是4,我相信這是因爲外部數組只是一個指針數組,因此實際上並沒有分配給它的任何RAM。
我如何知道x沒有被賦值?
謝謝,
喬
如果我有兩個數組喜歡這樣的:如何判斷多維數組是否未分配給?
short** x;
short** y = functionThatReturnsAnArray();
在這種情況下sizeof(x) == sizeof(y)
。 都是4,我相信這是因爲外部數組只是一個指針數組,因此實際上並沒有分配給它的任何RAM。
我如何知道x沒有被賦值?
謝謝,
喬
從你的原始文章中的評論,你的意思是你是否可以知道一個值是否被賦值給一個變量。我們稱初始化爲。當一個值沒有被存儲到一個變量中時,它是未初始化的,這很糟糕,因爲你永遠不知道它裏面可能存在什麼,不,你不能檢查它是否已經被初始化,所以當你聲明時初始化它。
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;
}
}
+1用於澄清術語,超出此問題的範圍非常有用。 – delnan
的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;
}
不能檢查,如果一個變量已被分配到。未初始化的變量的值是未定義的IIRC。根據Assigning pointer to uninitialized variable changes it value?(由Seth Carnegie發現),即使訪問它也會導致未定義的行爲。
解決方案?顯式指定一個標記值並檢查它。對於指針來說,NULL
通常是有意義的。
看一個未分配變量的值不是UB嗎? –
@SethCarnegie:正如我所指出的,我不是100%確定的。參考將是很好的。也許這只是我的一個混淆術語?如果標準保證了未初始化(local,non-'static)變量的值,但是它可能不符合UB的確切定義,我會非常驚訝。 – delnan
不,它絕對不能保證未初始化變量的值,但顯然你是對的,它被稱爲UB根據http://stackoverflow.com/q/7468166/726361,這是由我信任的Als寫的關於這樣的事情。我認爲這將是實現定義的行爲,但顯然不是。 +1 –
定義「空」。 – delnan
在你的情況下,'x'和'y'的大小將始終爲'4',即使它們有分配給它們的內存,因爲sizeof'只返回其參數的大小,並且指針的大小始終'4'(在你的情況下),無論它指向什麼。 –
delnan - 未分配給 – JoeS