2016-12-13 3 views
2

書き込みしようとしなかったにもかかわらず、現時点では書き込みに問題がある(gdb経由で構造体のメンバーを見て確認した)RAM書き込みに関するCコードに問題がありますそのエリア。以下のようにRAM領域への書き出し

私の構造体が宣言されています:

typedef struct tcb { 
    unsigned int tid; 
    thread_state_t state; 
    pthread_t thread; 
    sem_t sema; 
    unsigned long interval; 
    unsigned long rtime; 
} tcb_t ; 

typedef struct node { 
    tcb_t *tcb; 
} node; 

typedef struct entry entry; 

typedef struct entry { 
    entry *next; 
    entry *prev; 
    node node; 
} entry; 

これらの定義が提供されていると私はそれらを変更することはできません。 私は今、このコードでentryの配列を初期化:

entry = malloc((num_threads) * sizeof(entry)); 

for (i = 0; i < num_threads; i++) 
{ 
    entry[i].next = NULL; 
    entry[i].prev = NULL; 
    entry[i].node.tcb = malloc(sizeof(tcb_t)); 
    entry[i].node.tcb->tid = i; 
    entry[i].node.tcb->state = THREAD_RUNNABLE; //initialize value to show the scheduler this thread works for the first time 
    entry[i].node.tcb->interval = interval; 

} 

他のフィールドは、この時点で初期化することを意図していません。しかし、一度私のコードを実行すると、num_threads = 6と言うと、entry[0].node.tcb->tidの値は0の値を失いましたが、何か変なことがあります(私のポインタのように見えます)。

このフィールドにgdbでウォッチポイントを設定すると、entry[i].node.tcb = malloc(sizeof(tcb_t));という行に私の値が上書きされたことが通知されます(この時点でiは値2を保持しています)。どうしてこれなの?それはコンパイルされません -

+0

gdb watchpointは 'entry [i] .node.tcb = malloc(sizeof(tcb_t));行にあなたに通知します;' what'の値は 'i'ですか? – CiaPan

+0

'valgrind'はあなたを助けてくれるかもしれない –

+0

iiの値はi = 2で通知されます。下にgdbの出力を投稿します(それはひどいかもしれません、ごめんねです) 255 entry [i] .node.tcb = malloc sizeof(tcb_t)); aufgabe_5.cのエントリ[0] .node.tcb-> TID 古い値= 0 新しい値= 6299888 メイン(ARGC = 3、ARGV = 0x7fffffffe688): (GDB)N ハードウェアウォッチポイント2 256 256エントリ[i] .node.tcb-> tid = i; (gdb)print i $ 1 = 2 – PfannkuchenXD

答えて

4

あなたは行書かれたよう

entry = malloc((num_threads) * sizeof(entry)); 

を持つことはできません。あなたのプログラムが

entry[i].next = NULL; 

ようなラインを持っているので、私はそれがだから今sizeof(entry)が何であるか、実際に

entry *entry = malloc((num_threads) * sizeof(entry)); 

ですね?私の小さなテストプログラムは、それが4、ポインタのサイズではなく、構造体であると私に伝えます。

固有の識別子を使用してください。

+1

正に 'sizeof'は' sizeof(* entry) 'でしょう。変数の型を宣言だけでなく割り振りではなく、正しいサイズにする必要があります)。つまり、型名を変数名として再利用することは悪い考えです。 – ShadowRanger

+0

ありがとうございます。私は宿題の面でこれをやっています。私たちは常に彼らが私たちに欲しいと思うコードの "フレーム"を受け取ります。このコード "frame"には 'entry * entry'という行が含まれていました。今、変数名を変更しました。 – PfannkuchenXD

+0

上記のコメントは良いです:あなたは 'sizeof * entry'を使って重複した名前が問題にならないでしょうか?このエラー(ポインタのサイズを取得する)は古い栗です。それとは別に、 'sizeof'は*型*を参照するときに括弧しか必要としませんが、変数を参照するときは必要としません。 –

関連する問題