Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在堆中定义不同大小的结构_C++_C_Heap Memory_Biginteger_Multiprecision - Fatal编程技术网

C++ 在堆中定义不同大小的结构

C++ 在堆中定义不同大小的结构,c++,c,heap-memory,biginteger,multiprecision,C++,C,Heap Memory,Biginteger,Multiprecision,我正在尝试实现一个bigInt库。我一直在检查其他库,如,或,但其中任何一个都满足项目的要求(因为许可证,因为它们只使用堆栈,等等) 我将遵循libtommath的方法(非常好地用C编写文档),但我希望所有的内容都存储在堆中。libtommath在如下结构中实现bigInt: typedef struct { int used, alloc, sign; mp_digit *dp; } mp_int; 正如您所见,它有一个用于访问值的间接方法。(mp_数字是大整数的数字)。我

我正在尝试实现一个bigInt库。我一直在检查其他库,如,或,但其中任何一个都满足项目的要求(因为许可证,因为它们只使用堆栈,等等)

我将遵循libtommath的方法(非常好地用C编写文档),但我希望所有的内容都存储在堆中。libtommath在如下结构中实现bigInt:

typedef struct  {
    int used, alloc, sign;
    mp_digit *dp;
} mp_int;
正如您所见,它有一个用于访问值的间接方法。(mp_数字是大整数的数字)。我想脱离间接寻址,在堆中有一些类似的结构,其中最后一个元素是mp_digit[],其中mp_int的每个实例的大小可能不同

我可以使用void*和malloc()实现,因为我知道前X个位置是int,带有信息(已使用、alloc、符号等),然后访问mp_数字[],知道偏移量,但我不喜欢这个想法。我不知道哪一种方法更好

我发现了其他类似的问题,比如或,但它们并没有全部存储在堆中,所以我的问题有点棘手/不同


谢谢,

在C中创建类似的内容

mp_int *LN_Create(int ndigits, int allocate)
{
    mp_int *ln = calloc(1, sizeof mp_int);

    if (ln != NULL)
    {
        ln->ndigits = ndigits;
        if (allocate)
        {
            ln->dp = calloc(ndigits, sizeof mp_digit);
            ln->alloc = 1;
            if (ln->dp == NULL)
            {
                free(ln);
                ln = NULL;
            }
        }
    }
    return ln;
}


在C语言中,创建类似这样的内容

mp_int *LN_Create(int ndigits, int allocate)
{
    mp_int *ln = calloc(1, sizeof mp_int);

    if (ln != NULL)
    {
        ln->ndigits = ndigits;
        if (allocate)
        {
            ln->dp = calloc(ndigits, sizeof mp_digit);
            ln->alloc = 1;
            if (ln->dp == NULL)
            {
                free(ln);
                ln = NULL;
            }
        }
    }
    return ln;
}


C中,
mp\u digit dp[]
表示灵活的数组成员。这出现在C99中:

typedef struct  {
    int used, alloc;
    signed char sign;
    mp_digit dp[];
} mp_int;
您可以使用
malloc(sizeof(mp_int)+alloc*sizeof(mp_digit))分配内存;还有realloc

然而,根据
mp_digit
的类型,
dp
的偏移量不一定是
sizeof(mp_int)
的偏移量,但可能更小;在计算实际分配的最小大小时,有一个拙劣的宏破解(但这仍然是可移植的)

该定义在C++中不起作用,但可以使用指向C++中不完整类型的指针。



请注意,灵活数组成员与1字节数组(如C中的不兼容,
mp\u digit dp[]
将表示灵活数组成员。这出现在C99中:

typedef struct  {
    int used, alloc;
    signed char sign;
    mp_digit dp[];
} mp_int;
您可以使用
malloc(sizeof(mp_int)+alloc*sizeof(mp_digit))分配内存;还有realloc

然而,根据
mp_digit
的类型,
dp
的偏移量不一定是
sizeof(mp_int)
的偏移量,但可能更小;在计算实际分配的最小大小时,有一个拙劣的宏破解(但这仍然是可移植的)

该定义在C++中不起作用,但可以使用指向C++中不完整类型的指针。



请注意,灵活数组成员与1字节数组(如in)不兼容,请选择一种语言。更改
mp\u digit*dp
std::vector dp
remove
used
alloc
作为定义和使用此类结构的示例,您可以查看()。基本上,你只需分配缓冲区保持结构本身,就可以通过一系列的项目来跟踪。你所希望的int不能用作本地变量。@ JuangopangZa我将用C++编译器编译它,所以如果我们能使用C++的一些好处/抽象的话,它是很好的。如果我必须以C开发人员的身份编写应用程序的这一部分,我不会有任何问题。请选择一种语言
std::vector dp
remove
used
alloc
作为定义和使用此类结构的示例,您可以查看()。基本上,你只需分配缓冲区保持结构本身,就可以通过一系列的项目来跟踪。你所希望的int不能用作本地变量。@ JuangopangZa我将用C++编译器编译它,所以如果我们能使用C++的一些好处/抽象的话,它是很好的。如果我必须以C开发人员的身份编写应用程序的这一部分,我不会有任何问题。这完全是毫无意义的,因为它需要2个分配,并且间接寻址没有被删除。这是OP所要求的。我不评论他的需要。结构的字段正好显示了他想要的内容。他写了“想要摆脱间接寻址”,您的代码显示的内容与他已经得到的内容基本相同。没有注意到这句话这是完全没有意义的,因为它需要2个分配,间接寻址没有被删除。这是OP要求的。我不评论他的需要。结构的字段正好显示了他想要的内容。他写了“想要摆脱间接寻址”,您的代码显示的内容与他已经得到的内容基本相同。没有注意到这句话