簡體   English   中英

在函數內部傳遞用於內存分配的指針?

[英]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轉換)。

類似地, xallocStreamStruct參數從不更改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM