2017-04-27 95 views
-1

說我有從按值返回結構結構在循環值

struct foo{ 
    int bar; 
    bool success; 
} 

foo getThefoo(); 

如果調用此函數如

int foolen = 0; 
foo** foos; 
do { 
    foolen++; 
    foos = realloc(foos,sizeof(foo*)*foolen); 
    foo myfoo = getThefoo(); 
    foos[foolen-1]=&myfoo; 

}while (/**something*//) 

在一個循環中發生什麼事情的新富另一個API函數struct爲每次迭代在堆棧上分配?或者是初始分配重用?我問,因爲指向這個結構的指針可能是一個意想不到的值。

getThefoo是在外部庫中定義的。因此,它不是微不足道的返回一個指向食物結構的指針。

+3

未定義的行爲。將數據複製到堆或在超出範圍時無效。 –

+1

如果顯示的代碼編譯了C++編譯器,則使用該編譯器。它不會使用C編譯器進行編譯。 ('foo myfoo = ...','sizeof(foo *)')。對於顯示爲有效的C代碼,所有這些「foo」都需要是「struct foo」。 – alk

+1

@alk另外,還有兩個分號丟失。 – wildplasser

回答

1

這不起作用,你存儲的地方將超出範圍,使存儲的地址無用。

正確的修復似乎是不存儲指針struct foo在數組中,只是將它們存儲直接:

struct foo *foos = NULL; 
size_t foolen = 0; 

do { 
    ++foolen; 
    foos = realloc(foos, foolen * sizeof *foos); 
    foos[foolen - 1] = getTheFoo(); 
} while(something something); 

當然,平時的告誡適用於:

  • 它更通過分別過度分配和跟蹤數組長度和陣列分配空間,低效率地調用realloc()
  • realloc()可能會失敗,上述情況會丟失舊分配(如果有的話)。

請注意,結構是值,因此可完全賦值,所以這就是我們所做的。