加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

struct中灵活的mpz_t数组

发布时间:2020-12-16 05:02:00 所属栏目:百科 来源:网络整理
导读:我有这样的结构: typedef struct{ size_t length; // length of the array size_t numbits; // number of bits allocated per val in vals mpz_t vals[]; // flexible array to hold some number of mpz_t array} CoolArray; 好的,所以它是一个普通的灵活数
我有这样的结构:
typedef struct{
    size_t length; // length of the array
    size_t numbits; // number of bits allocated per val in vals
    mpz_t vals[]; // flexible array to hold some number of mpz_t array
} CoolArray;

好的,所以它是一个普通的灵活数组,我应该可以使用malloc来设置
它的大小:

void initArray(CoolArray* array,size_t length,size_t numbits){
    assert(length>=1); // don't make arrays with a length<=0

    // first I allocate memory for vals...
    array->vals = (mpz_t*) malloc(sizeof(CoolArray)+length*sizeof(mpz_t));

    // then I allocate memory for each val in vals
    mpz_array_init(array->vals,(size_t)length,numbits);

    return;
}

但是当我尝试使用它时,我遇到了分段错误.我也受到了投诉
关于错误使用mpz_array_init.但我看过manula,它
好像我正确地这样做了.

我也尝试使用我的结构:

typedef struct{
    size_t length; // length of the array
    size_t numbits; // number of bits allocated per val in vals
    mpz_t* vals; // pointer to start of array
} CoolArray;

我还将initArray函数更改为:

void initArray(CoolArray* array,size_t numbits) {
    assert(length>=1); // don't make arrays with a length<=0

    // first I allocate memory for vals...
    array->vals = (mpz_t*) calloc(length,sizeof(mpz_t));

    // then I allocate memory for each val in vals
    mpz_array_init(array->vals,numbits);

    return;
}

这个不是段错误,但我在编译时得到投诉
mpz_array_init的使用不正确,我也得到了一堆malloc错误
在我的输出中,以及我想看到的输出.有谁能告诉我我的位置
代码不正确?为什么第一个版本是segfault?我这样做了
人似乎在推荐.为什么编译器会抱怨
mpz_array_init使用不当?

这是我在输出中得到的那种错误:

gmpascal(80964) malloc: *** error for object 0x100801088: Non-aligned
pointer being freed *** set a breakpoint in malloc_error_break to debug

附: gmpascal是我的可执行文件的名称,它计算第n行
帕斯卡三角形.

P.P.S.我正在使用这些标志在Powermac上使用gcc-4.2进行编译:

-arch ppc64 -o gmpascal gmpascal.c -lgmp -Wall

这里有什么我想念的吗?

解决方法

请记住,我不编写gmp,但结构中的尾部动态缓冲区通常是这样实现的(适应我认为你想要使用它):
typedef struct
{
  size_t length;  //length of the array
  size_t numbits; //number of bits allocated per val in vals
  mpz_t vals[1];  //flexible array to hold some number of mpz_t array
} CoolArray;

分配策略,知道值的数量和位深度,将是:

CoolArray* allocArray(size_t length,size_t numbits)
{
   CoolArray *p = malloc(sizeof(*p) + sizeof(mpz_t)*length);
   p->length = length;
   p->numbits = numbits;
   mpz_array_init(p->vals,length,numbits);
   return p;
}

释放它(只是free()的包装器,但你可能需要做一些我不熟悉的gmp-cleanup):

void freeArray(CoolArray **pp)
{
    if (*pp)
    {
        free(*pp);
        *pp = NULL;
    }
}

使用它:

CoolArray *pca = allocArray(length,numbits);

完成后释放它:

freeArray(&pca);

这些只是想法,但也许你可以从中得到一些东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读