[英]Passing pointers for memory allocation inside a function?
我需要在程序的許多不同位置分配結構數組,從而將工作放入函數中(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) ];
}
我不確定我是否理解您的問題,但似乎您需要一個函數,該函數將創建一個動態分配的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));
}
您是否沒有使用常規數組的任何原因? 例如;
struct s_stream* streamArray = malloc(sizeof(s_stream*structCount));
然后,您將擁有一個s_stream數組,您可以使用streamArray [0]到streamArray [structCount-1]進行訪問,而無需取消引用任何額外的指針。
您正在將指針memBlock_1
的副本傳遞給xalloc
,因此malloc
返回的地址將被寫入該副本,並且永遠不會到達調用函數。 由於您可能想讓該地址可用於xxyz
中的memBlock_1
,因此您必須傳遞一個指向char的指針作為第二個參數,
void xalloc(..., char **memBlock, ...)
並使用xalloc(..., &memBlock_1, ...);
。 在xalloc
主體中,將所有出現的memBlock
替換為*memblock
,例如(*memblock = malloc(blockSize)) == NULL
(無需(*memblock = malloc(blockSize)) == NULL
轉換)。
類似地, xalloc
的StreamStruct
參數從不更改StreamBuild
指向結構的xxyz
。 如果我正確解釋了您的意圖,則還必須在該參數上添加一個指針層void xalloc(struct s_stream ***StreamStruct, ..., ...)
,在調用xalloc(&StreamBuild, ..., ...)
void xalloc(struct s_stream ***StreamStruct, ..., ...)
中傳遞StreamBuild
的地址。 xalloc(&StreamBuild, ..., ...)
並在函數主體中取消引用指針,例如(*StreamStruct = malloc(structCount * i)) == NULL
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.