2016-07-08 11 views
1

私は、有理なGMP配列mpq_tをデータとして保持するリンクリストを実装しようとしています。さらに、現在のリンクリストlteの終わりまで長さを保持したいと思います。配列nリンクされたリストとGMP変数

私は任意のmpq_t配列を生成し、それを配列を保持する新しいノードを作成するための私のGMPlist_push関数に送ります。

以下のコードは動作しますが、私は何か些細なことを忘れてしまったか、自分のGMPインストールに問題があります。私はそれを実行すると、5つの乱数をストリームして、どのノードにあるのかを教えてくれるが、私のMacBookでは1、4294967297、4294967298、4294967297となり、私のDebianデスクトップ上で同じコードを使ってみてください...

これは、Linuxマシンで私の好きなところで動作するように見える「予測できない」動作のようです。私が忘れたものを見ることができますか?また、誤った動作を再現できますか?

実行可能ファイルはエラーなしで実行されますが、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では、 ライナー

答えて

0

をありがとう、あなたは、メモリの適切な量を割り当てていない:

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

あなたはGMPlistの大きさをしたい、しかし、あなたが取得していますGMPlist *のサイズは小さくなります。

代わりにこれを行います。

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

あなたはvalgrind下のコードを実行する場合は、あなたがになっていないメモリを書いて/読んでいる場所、それはあなたが表示されます。

+0

あなたの答えは問題を解決します!ありがとうございました! ValgrindとGMPはうまく機能しませんが、GMPの既知の問題の1つです。 [クリック](https://gmplib.org/manual/Debugging.html#Debugging) –

関連する問題