2017-09-03 4 views
-1

を失敗しました。私は最近Cを学習し、いくつかのアプリケーションを書いていた始めた、私は私が前に見たことがないとされ、私はここでC:mallocのアサーション

malloc.c:2394: Assertion (old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0) failed. Aborted (core dumped)

をmallocingていたときに明らかになっていますがそれはこのエラーを取得していますコードスニペット

typedef struct { 
    Node *root; 
    pthread_id id; 
    pid_t tid; 
}Thread; 

typedef struct { 
    Thread **thread; 
    int cap, len; 
}arr; 

static __thread Thread *self = NULL; 
pthread_mutex_t lock; 
static arr p; 

static void 
foo (void) 
{ 
    pthread_mutex_lock(&lock); 
    Thread **newthread; 
    if (p.len == p.cap){ 
     if (p.cap != 0){ 
      newthread = (Thread **) realloc(p.thread, (1+p.cap)*sizeof(Thread *)); 
     } 
     else { 
      newthread = (Thread **)malloc(sizeof(Thread *)); 
     } 
     if (!newthread){ 
      printf("appendThreadpointer: Error while allocating size\n"); 
      exit(1); 
     } 
     p.thread=newthread; 
     ++p.cap; 
    } 

    ++p.len; 
    Thread *t = malloc(sizeof(Thread *)); 
    t->tid = syscall(SYS_gettid); 
    t->root = newNode(); 
    t->id = pthread_self(); 
    p.thread[p.len-1] = t; 
    self = t; 
    pthread_mutex_unlock(&lock); 
} 

誰にもこれが起こっている可能性がある理由を知ることができますか?そして私がtidフィールドをThread構造体から削除した場合、それはうまく動作します。tidフィールドを含めると、このエラーが発生します。

混乱していますが、これについてのお手伝いがあります、ありがとうございます。

+3

'スレッド*トン=のmalloc(はsizeof(スレッド*))に変更する必要があります;' - これは魚に見えます。あなたはスレッドへのポインタのためのスペースを割り当てますが、スレッドのためのスペースが必要です: 'Thread * t = malloc(sizeof(Thread));または' Thread * t = malloc(sizeof(* t)); 。 (あなたが得るエラーは、 't'の不足分を割り振って後で境界から書き出すことによって、ダイナミックメモリのCライブラリのハウスホールディングデータを破壊することに関連する可能性があります) –

+0

ああ、そんなに愚かな間違いです。 、ありがとう、 – Nik391

答えて

0
Thread *t = malloc(sizeof(Thread *)); 

はおそらく

Thread *t = malloc(sizeof(Thread)); 
+2

'ptr = malloc(sizeof(* ptr))'としてmallocsを書く習慣を身につければ、多くの悲しみを節約できます。 (これは、 'sizeof(Thread)'やptrとして宣言されているものよりも優れています.ptrの記憶クラスを変更しても正しいと言えます)。 – Jabberwock