2012-01-07 81 views
0

我需要在我的程序中的一堆不同位置分配結構數組,從而將這些工作放入一個函數(VS 2010)中。編譯器給出了有關使用未初始化變量的警告。那麼我該如何傳遞它,以及如何在函數中聲明它。我已經嘗試了很多「&」和「*」的變體,但都無濟於事。在函數內部傳遞指針用於內存分配?

(我提前道歉,如果我的代碼導致的任何形式的噁心......我是英語專業。)

struct s_stream { 
int blah; 
}; 

void xxyz(void) 
{ 
    struct s_stream **StreamBuild; 
    char *memBlock_1; 

    xalloc(StreamBuild, memBlock_1, 20); 
} 



void xalloc(struct s_stream **StreamStruct, char *memBlock, int structCount) 
{ 
    int i = sizeof(struct s_stream *); 
    if ((StreamStruct=(struct s_stream **) malloc(structCount * i)) == NULL) 
     fatal("failed struct pointer alloc"); 

    int blockSize = structCount * sizeof(struct s_stream); 
    if ((memBlock = (char *) malloc(blockSize)) == NULL) 
     fatal("failed struct memBlock alloc"); 

    // initialize all structure elements to 0 (including booleans) 
    memset(memBlock, 0, blockSize); 

    for (int i = 0; i < structCount; ++i) 
     StreamStruct[i]=(struct s_stream *) &memBlock[i*sizeof(struct s_stream) ]; 
} 
+0

你到底想要做什麼 - 是否動態分配'struct s_stream'對象的數組? – 2012-01-07 20:10:03

+0

告訴我們編譯器的確切警告。特別是編譯器不喜歡哪一行代碼? – 2012-01-07 23:58:47

回答

0

你傳入指針memBlock_1副本xalloc,所以通過malloc返回的地址被寫入複製和永遠不會到達調用函數。既然你大概想的地址提供給xxyzmemBlock_1,你必須通過一個指針到指針到焦炭作爲第二個參數,

void xalloc(..., char **memBlock, ...) 

xalloc(..., &memBlock_1, ...);調用它。在xalloc的主體中,將所有出現的memBlock替換爲*memblock,例如, (*memblock = malloc(blockSize)) == NULL(不需要投)。

類似地,的xallocStreamStruct的參數從不改變在xxyzStreamBuild指針到指針到結構s_stream。如果我正確解釋你的意圖,你還必須添加一個指向該參數的指針層,void xalloc(struct s_stream ***StreamStruct, ..., ...),在調用中傳遞StreamBuild的地址,xalloc(&StreamBuild, ..., ...)並取消引用函數體中的指針,例如, (*StreamStruct = malloc(structCount * i)) == NULL

+0

我遵循你的建議;剩下的2個問題:編譯器將不允許:(* StreamStruct = malloc(structCount * i))...我必須轉換爲(struct s_stream **)。另一個問題是我通過循環並將指針指向內存塊的最後2行:for(int i = 0; i PaeneInsula 2012-01-07 21:56:23

+0

如果您需要投射'malloc'的結果,那意味着您將程序編譯爲C++,而不是C。可能不是什麼大不了的事情,這兩個人有足夠的共同點,那就是簡單的程序編譯和工作都是這樣的(在投射'malloc'返回等等之後)。在循環中,它應該是'for(...)(* StreamStruct)[i] =&memBlock [...];' - 除非我忽略了某些東西。嗯,'未處理的異常'。是的,C++。如果你正在編譯爲C++(對於微軟的編譯器來說不是一個壞主意,它不支持C99,但它可以作爲C++編譯器),你可以考慮使用'new'等編寫C++。 – 2012-01-07 22:14:06

+0

這是正確的? for(...)(* StreamStruct)[i] =&memBlock [...]; OR(...)(* StreamStruct)[i] =(* memBlock)[...]; ?後者似乎工作,並與前面說的一致... – PaeneInsula 2012-01-07 23:41:31

3

我不太確定我明白你的問題,但它似乎像你需要一個函數來創建一個動態分配的struct s_stream對象數組並將它們返回給調用者。如果是這樣的話,這是很容易:

void easiest(void) 
{ 
    struct s_stream *array = malloc(20 * sizeof(struct s_stream)); 
} 

您可以在malloc()關閉移動到其自身的功能和返回指針:

void caller(void) 
{ 
    struct s_stream *array = create_array(20); 
} 

struct s_stream *create_array(int count) 
{ 
    return malloc(count * sizeof(struct s_stream)); 
} 

或者,如果你堅持要傳遞數組作爲參數:

void caller(void) 
{ 
    struct s_stream *array; 
    create_array(&array, 20); 
} 

void create_array(struct s_stream **array, int count) 
{ 
    *array = malloc(count * sizeof(struct s_stream)); 
} 
+0

你的第一個'create_array()'應該返回'void *'不應該嗎?或者更好'struct stream *'是類型安全的。 – alk 2012-01-07 20:41:42

+0

Yup - 打印錯誤。當我回到電腦時我會解決它。 – 2012-01-07 23:53:41

+0

固定 - 當我在一點時間壓力下寫答案時,複製/粘貼錯誤。對於那個很抱歉! – 2012-01-08 02:10:23

0

是否有任何理由你不使用常規數組?例如;

struct s_stream* streamArray = malloc(sizeof(s_stream*structCount)); 

然後,你必須s_stream的陣列可以只是streamArray訪問[0]至streamArray [structCount-1]不解除引用任何額外的指針。

+0

這就是我原來的做法。但是我試圖在數組上使用qsort(這是240萬個成員),而且這個沉重的遞歸導致了堆棧溢出。所以試圖使用和排序指針,而不是.... – PaeneInsula 2012-01-07 22:04:19