我試圖實現一個鏈接列表,其中包含一個合理的GMP數組mpq_t
作爲其數據,此外我希望它保持當前鏈接列表的末尾長度爲lte
,爲了方便,陣列n
。使用GMP變量的鏈接列表
爲了測試它,我生成任意的mpq_t
數組,並將其輸入到我的GMPlist_push
函數中,該函數僅用於創建一個包含該數組的新節點。
下面的代碼工作,但無論是我忘記了一些微不足道的事情,或者我的GMP安裝有問題。當我運行它時,它應該流出5個隨機數,然後告訴我它在哪個節點上,但是在我的MacBook上它會變爲1,44294967297,4294967298,4294967297,然後它在兩者之間繼續振盪,當我運行完全相同的代碼在我的Debian桌面上它所需的1,2,3 ...
這似乎是'不可預知'的行爲,在Linux機器似乎對我有利,它不在我的Mac上。你能看到我忘了的東西嗎?你也可以重現一個錯誤的行爲?
可能值得注意的是,雖然可執行文件運行時沒有錯誤,但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;
}
謝謝 賴
您的答案解決了問題!謝謝! Valgrind和GMP不能很好地協同工作,這是GMP的一個已知問題。 [點擊](https://gmplib.org/manual/Debugging.html#Debugging) –