带有 GMP 变量的链表

Linked list with GMP variables

我正在尝试实现一个链表,它包含一个有理 GMP 数组 mpq_t 作为其数据,而且我希望它包含到当前链表末尾的长度 lte 和为方便起见,数组的长度 n

为了测试它,我生成了任意 mpq_t 数组并将其输入到我的 GMPlist_push 函数中,该函数旨在创建一个包含该数组的新节点。

下面的代码有效,但是要么我忘记了一些琐碎的事情,要么我的 GMP 安装有问题。当我 运行 它时,它应该流出 5 个随机数,然后告诉我它在哪个节点,但是在我的 MacBook 上它变成了 1, 4294967297, 4294967298, 4294967297 然后它继续在两者之间摇摆不定,当我 运行 在我的 Debian 桌面上使用完全相同的代码时,它会执行所需的 1,2,3...

这似乎是 'unpredictable' 行为,在 Linux 机器上似乎对我有利,但在我的 Mac 上却没有。你能看到我忘记的东西吗?您还可以重现错误行为吗?

可能值得注意的是,尽管没有错误的可执行文件 运行s lldb 因模糊的 malloc 错误而崩溃。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <gmp.h>
#include <assert.h>

struct GMPlist {
    mpq_t* data;
    size_t n, lte;
    struct GMPlist* next;
};

typedef struct GMPlist GMPlist;

mpq_t *randomVector(size_t n){
    mpq_t* retVal;
    retVal = malloc(n*sizeof(*retVal));
    size_t i;
    size_t den,num;
    for (i = 0; i < n; i++){
        mpq_init(retVal[i]);
        den = (size_t)rand();
        num = (size_t)rand();
        mpq_set_ui(retVal[i],den,num);
        mpq_canonicalize(retVal[i]);
    }
    return retVal;
}


void GMPlist_push(GMPlist** elem, mpq_t* data){
    GMPlist* nextElem = malloc(sizeof(GMPlist*));

    nextElem->next = *elem;
    nextElem->lte = (*elem)->lte + 1;
    nextElem->n = (*elem)->n;

    nextElem->data = data;
    *elem = nextElem;
}

int main(int argc, char const *argv[])
{
    GMPlist* elem = malloc(sizeof(GMPlist));


    srand(time(NULL));

    elem->next = NULL;
    elem->lte = 0;
    elem->n = 5;
    mpq_t* tester;
    size_t i,j;

    for (j = 0; j<10; j++){
        tester = randomVector(5);

        GMPlist_push(&elem, tester);

        for (i=0; i<5; i++){
            mpq_out_str(stdout,10,elem->data[i]);
            fprintf(stdout, " ");
        }
        fprintf(stdout, ", %lu\n", elem->lte );
    }
return 0;
}

谢谢, 莱纳

GMPlist_push 中,您没有分配适当的内存量:

GMPlist* nextElem = malloc(sizeof(GMPlist*));

您想要 GMPlist 的大小,但得到的 GMPlist * 的大小更小。

改为这样做:

GMPlist* nextElem = malloc(sizeof(GMPlist));

如果您 运行 valgrind 下的代码,它会告诉您 reading/writing 您不应该去的内存。