2016-05-19 10 views
0

私が使用しているテストプログラムに少し問題があります。その値を更新しようとしてポインタを間接参照しようとすると、segfaultが発生します。SegfaultがC言語でintポインタを更新しています

これはと呼ばれる関数である:私が使用している場合

int main(void) { 

    t_init(); 

    mbox_create(&mb); 
    t_create(producer, 1, 1); 
    t_create(producer, 2, 1); 
    t_create(consumer, 3, 1); 
    t_yield(); 

    int len; 
    char mesg[1024]; 
    mbox_withdraw(mb, mesg, &len); // should print a warning about the mailbox not having any messages 

    mbox_destroy(&mb); 

    t_shutdown(); 
    printf("Done with mailbox test...\n"); 
    fflush(stdout); 

    return 0; 
} 

::これは、呼び出し元の関数である

// Extracts a message from the community mailbox 
void mbox_withdraw(struct mbox *mb, char *msg, int *len) 
{ 
    // Locks the semaphore 
    sem_wait(lock); 

    // If message node is null, there is no message, just return 
    if (mb->msg != NULL) 
    { 
    int var = strlen((mb->msg)->message); 
    len = &var; 
    strncpy(msg, (mb->msg)->message, len + 1); 


    // If there is only one message node 
    if ((mb->msg)->next == NULL) 
    { 
     (mb->msg)->message = NULL; 
     free((mb->msg)->message); 
     mb->msg = NULL; 
     free(mb->msg); 
    } 

    // There are more than one message, just take the first one 
    else 
    { 
     struct messageNode *temp = mb->msg; 
     mb->msg = (mb->msg)->next; 
     temp->message = NULL; 
     free(temp->message); 
     temp->next = NULL; 
     free(temp); 
    } 
    } 
    // Unlocks the semaphore 
    sem_signal(lock); 
} 

int var = strlen((mb->msg)->message); 
     len = &var; 

ないセグメンテーションフォルトもちろん​​ではありません値を更新する適切な方法。私が使用している場合:

int var = strlen((mb->msg)->message); 
     *len = var; 

これはこのサイトの私の最初の投稿ですので、この投稿が厄介なようであればよろしくお願いいたします。

答えて

1

機能では、lenがポインタです。あなたはここで何をしている:

int var = strlen((mb->msg)->message); 
len = &var; 
strncpy(msg, (mb->msg)->message, len + 1); 

コピーしようとしている(値として(0x12345678のが含まれています)ポインタを使用して、その後、LENポインタへのVARのアドレスを割り当てる(例えば、それは0x12345678のすることができます)とされます0x12345678 + 1データから(msg - > msg) - > msgへのメッセージ)、segfaultが発生します。

第二の方法は、LENポインタ値(アドレスではない)にVaRの値を割り当て、右ですが、あなたが行う必要があります。

strncpy(msg, (mb->msg)->message, *len + 1); 

をポインタの値を取得します。

+0

はい、問題はまさにその問題でした。私は間違った行を修正しようとしていました。ありがとうございました – stak0verflow

1

テストされていませんが、私の電話を使用しています。私は下のstrncpyコールにもっと反応します。 -Wallフラグではgccを使用して

*len = var; 
strncpy(msg, (mb->msg)->message, *len + 1); 

それとも

*len = var; 
strcpy(msg, (mb->msg)->message); 
0

中に、警告

len = &var; 
strncpy(msg, (mb->msg)->message, len + 1); 

を与える必要がある場合は、私はセグメンテーションフォルトを使用すると、指定した行によって生成されていないと思います。 gccを使用する場合は、gdbでデバッグするか、valgrindのようなメモリエミュレーションで実行することをお勧めします。次に、どの行がsegfaultingであるかがわかります。

lenが正しく設定されていないと、結果が出ます。私はあなたには、いくつかの行を削除しますが、それは一回のみ使用され、ここであなたが書くことができるよう規定された例lenと、意味がありませんと仮定します。

strncpy(msg, (mb->msg)->message, var + 1); 
関連する問題