簡體   English   中英

C中簡潔的動態內存分配

[英]Succinct dynamic memory allocation in C

在偽代碼中,我想替換:

ra             =  (double *)  realloc(ra,   Num*sizeof(*ra));
dec            =  (double *)  realloc(dec,  Num*sizeof(*dec));
zobs           =  (double *)  realloc(zobs, Num*sizeof(*zobs));
M_B            =  (double *)  realloc(M_B,  Num*sizeof(*M_B));

例如 mem_allocate(&ra, &dec, &zobs, &M_B)

在哪里

mem_allocate(arg1, arg2,..., arg4){

for argi in arg1 to arg4{
     argi = (double *)  realloc(argi, Num*sizeof(*argi))

}

}

為了我之前評論的完整性,一個例子是

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool mem_allocate (double *vars[], size_t N_vars, size_t newWidth)
{
    double *temp;

    printf("\n");

    for (size_t i=0; i<N_vars; i++)
    {
        temp = realloc(vars[i], newWidth*sizeof(*temp));

        if (temp != NULL)
        {
            printf ("temp: %p\n", (void *)temp);
            vars[i] = temp;
        }
        else
        {
            return false;
        }
    }

    printf("\n");

    return true;
}

int main (void)
{
    double *var1 = malloc(sizeof(*var1));
    double *var2 = malloc(sizeof(*var2));
    double *var3 = malloc(sizeof(*var3));
    double *var4 = malloc(sizeof(*var4));

    printf ("var1: %p\n", (void *)var1);
    printf ("var2: %p\n", (void *)var2);
    printf ("var3: %p\n", (void *)var3);
    printf ("var4: %p\n", (void *)var4);

    double *vars[4];

    vars[0] = var1;
    vars[1] = var2;
    vars[2] = var3;
    vars[3] = var4;

    if (mem_allocate (vars, sizeof(vars)/sizeof(vars[0]), 200) == true)
    {
        var1 = vars[0];
        var2 = vars[1];
        var3 = vars[2];
        var4 = vars[3];

        printf ("var1: %p\n", (void *)var1);
        printf ("var2: %p\n", (void *)var2);
        printf ("var3: %p\n", (void *)var3);
        printf ("var4: %p\n", (void *)var4);
    }

    return 0;
}

在函數 mem_allocate 中更改varx將意味着 3 星實現,我真的不喜歡。

顯然必須檢查所有malloc返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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