私は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信号が得られます。私は、型変換が正しく行われていないと思います。
「memcpy」の引数1は、コピー先のアドレス(より具体的にはアドレスへのポインタ)です。 '&(p-> mtext)'を試してください。 [Man Page on Memcpy](http://www.kernel.org/doc/man-pages/online/pages/man3/memcpy.3.html)を参照してください。 – Chad
このメッセージ( "*はキャストなしの整数からポインタを作る")は、キャストを追加する必要はありません。実際に**あなたはキャスト**を追加すべきではなく、代わりに正しいポインタを得るべきです。 – pmg
'buff'はどこにも定義されていません... – sth