加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux上的C编程新手,坚持使用类型转换

发布时间:2020-12-14 01:00:05 所属栏目:Linux 来源:网络整理
导读:我对 Linux上的编程很新.我正在尝试在我的一个任务中实现一个消息队列.但我无法做到.代码如下: #include stdio.h#include sys/ipc.h#include sys/msg.h#include linux/sched.h#include stdlib.h#include string.htypedef long MSISDN;typedef struct { long
我对 Linux上的编程很新.我正在尝试在我的一个任务中实现一个消息队列.但我无法做到.代码如下:

#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信号.我想我没有正确地得到类型转换.

解决方法

这不是类型转换,而是论证本身. p-> mtext是一个long,而不是一个指针.您需要将p-> mtext的地址作为dest参数发送到memcpy.你得到了段错误,因为memcpy试图写入p-> mtext指向的内存地址,这显然不在你进程的地址空间中.

这就是原因 – 因为这是一项家庭作业,我将把代码的修复留给你.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读