Tôi khá mới để lập trình trên Linux. Tôi đang cố gắng triển khai hàng đợi thư trong một trong các bài tập của tôi. Nhưng tôi không thể làm được. Mã như sau:Lập trình C mới trên Linux, bị kẹt tại kiểu chữ
#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();
}
Vấn đề là memcpy
không hoạt động. Tôi nhận được cảnh báo:
. cảnh báo: đối số truyền 1 của ‘memcpy’ làm cho con trỏ từ số nguyên không có dàn diễn viên [được bật theo mặc định]
Ngoài ra khi tôi chạy mã, nó sẽ nhận tín hiệu SIGSEGV tại memcpy. Tôi nghĩ rằng tôi không nhận được typecast một cách chính xác.
Đối số 1 của 'memcpy' là một địa chỉ để sao chép vào (một con trỏ đến một địa chỉ cụ thể hơn). thử '& (p-> mtext)'. Xem [Man Page on Memcpy] (http://www.kernel.org/doc/man-pages/online/pages/man3/memcpy.3.html). – Chad
Thông báo này ("* làm cho con trỏ từ số nguyên không có dàn diễn viên *") không có nghĩa là bạn nên thêm một diễn viên. Trong thực tế ** bạn không nên thêm một diễn viên **, nhưng thay vào đó hãy lấy con trỏ chính xác. – pmg
'buff' không được định nghĩa ở bất cứ nơi nào ... – sth