2016-07-08 71 views
1

我試圖實現一個鏈接列表,其中包含一個合理的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; 
} 

謝謝 賴

回答

0

GMPlist_push,你不分配的內存適量:

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

你想要一個GMPlist的大小,但你得到尺寸較小的GMPlist *

而是執行此操作:

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

如果您運行valgrind下的代碼,它會告訴你,你正在讀/寫你不應該到內存。

+0

您的答案解決了問題!謝謝! Valgrind和GMP不能很好地協同工作,這是GMP的一個已知問題。 [點擊](https://gmplib.org/manual/Debugging.html#Debugging) –