2012-02-15 18 views
5

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.

+2

Đố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

+0

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

+0

'buff' không được định nghĩa ở bất cứ nơi nào ... – sth

Trả lời

5

Nó không phải là typecast, nó là đối số chính nó. p-> mtext dài, không phải là một con trỏ. Bạn cần gửi địa chỉ của p-> mtext làm đối số dest để ghi nhớ. Bạn đang nhận được segfault vì memcpy đang cố gắng ghi vào địa chỉ bộ nhớ được trỏ tới bởi p-> mtext, rõ ràng là không có trong không gian địa chỉ của tiến trình của bạn.

Đó là lý do - vì đây là bài tập về nhà, tôi sẽ để lại bản sửa mã cho bạn.

+0

Cảm ơn rất nhiều người ..... làm việc ngay bây giờ ..... :) – anshu

+0

@anshu Bất cứ lúc nào, chào mừng bạn đến Stack Overflow; và nhớ chấp nhận câu trả lời đã giải quyết được vấn đề của bạn. – Chad

Các vấn đề liên quan