2012-02-15 8 views
5

私はLinuxでプログラミングを始めたばかりです。私は自分の課題の一つにメッセージキューを実装しようとしています。しかし、私はそれをすることができません。コードは次のとおりです。動作しないLinuxでのCプログラミングの新機能、型キャスト時にぶつかりました

#include <stdio.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <linux/sched.h> 
#include <stdlib.h> 
#include <string.h> 

typedef long MSISDN; 
typedef struct 
{ 
    long mtype; 
    long mtext; 
}msgbuf; 

void init(int qid,int key) { 
    qid = msgget(key,IPC_CREAT|0666); 
} 

void sendMsg(long t_ype, long buf, int len, int qid) { 

    int length = sizeof(long) + sizeof(MSISDN); 
    msgbuf *p = malloc(length); 
    p->mtype = t_ype; 
    fputc('2',stderr); 
    void* tosend = (void*) buff; 
    fputc('3',stderr); 

    memcpy(p->mtext,tosend,length); 

    fputc('4',stderr); 
    msgsnd(qid,p,length,IPC_NOWAIT); 
    free(p); 
} 



void main() 
{ 
    int qid; 
    int key = 1111; 
    int len= sizeof(MSISDN); 
    long type_1=1; 
    long send = 12345; 

    init(qid,key); 
    fputc('1',stderr); 
    sendMsg(type_1,send,len,qid); 

    getchar(); 
} 

問題がmemcpyです。私は警告を受けています:

警告: 'memcpy'の引数1を渡すと、キャストのない整数からのポインタが生成されます。[デフォルトで有効になります]

また、コードを実行すると、memcpyでSIGSEGV信号が得られます。私は、型変換が正しく行われていないと思います。

+2

「memcpy」の引数1は、コピー先のアドレス(より具体的にはアドレスへのポインタ)です。 '&(p-> mtext)'を試してください。 [Man Page on Memcpy](http://www.kernel.org/doc/man-pages/online/pages/man3/memcpy.3.html)を参照してください。 – Chad

+0

このメッセージ( "*はキャストなしの整数からポインタを作る")は、キャストを追加する必要はありません。実際に**あなたはキャスト**を追加すべきではなく、代わりに正しいポインタを得るべきです。 – pmg

+0

'buff'はどこにも定義されていません... – sth

答えて

5

これは型キャストではなく、引数そのものです。 p-> mtextはポインタではなく長いものです。あなたはアドレスのp-> mtextをdest引数としてmemcpyに送る必要があります。 memcpyがあなたのプロセスのアドレス空間にはないp-> mtextが指すメモリアドレスに書き込もうとしているので、segfaultを取得しています。

これが理由です。これは宿題であるため、コードの修正はお任せします。

+0

ありがとうたくさんの人.....その作業..... ..... – anshu

+0

@anshuいつでも、スタックオーバーフローへようこそ;あなたの問題を解決した答えを受け入れることを忘れないでください。 – Chad

関連する問題