在做毕业设计的过程中,遇到了几个错误导致结果不对,在这里做一个总结

在做毕业设计的过程中,遇到了几个错误导致结果不对,在这里做一个总结

毕业设计主要的开发语言是C语言,C语言的基础还是不行。

错误一、msgsnd函数指针越界

功能描述
msgrcv()可以从消息队列中读取消息,msgsnd()将一个新的消息写入队列。
在消息队列上进行收发消息。为了发送消息,调用进程对消息队列进行写入时必须有写权能。接收消息时必须有读权能。
函数原型
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
struct msgbuf {
long mtype; /* 消息类型,必须 > 0 */
char mtext[1]; /* 消息文本 */
};

—— [ 百度百科]

msgsz 要发送消息的大小,不含消息类型占用的4个字节,即msgsz==mtext的长度。
错误的写法:

struct my_msg   //消息队列结构体  
{  
    long int my_msg_type;  
    unsigned short data;
}; 
int send_msg(int data, int msgid, struct my_msg* msg)
{
    msg->my_msg_type=3; 
    msg->data = data;
    msgsnd(msgid, msg, sizeof(struct my_msg), 0);   //发送数据到缓冲区  
    return 0;
}
int get_msg( int msgid, struct my_msg* msg){
    msg->my_msg_type=3;  
    return msgrcv(msgid, msg, sizeof(struct my_msg), msg->my_msg_type, 0);//接收数据
}

由于指定的参数msgsz错误,导致发送端和接收端都发生了指针越界。
正确的写法:

struct my_msg   //消息队列结构体  
{  
    long int my_msg_type;  
    unsigned short data;
}; 
int send_msg(int data, int msgid, struct my_msg* msg)
{
    msg->my_msg_type=3; 
    msg->data = data;

    int sendlength;
    sendlength = sizeof(struct my_msg) - sizeof(long int) ;
    msgsnd(msgid, msg, sendlength, 0);   //发送数据到缓冲区  
    return 0;
}

int get_msg( int msgid, struct my_msg* msg){
    msg->my_msg_type=3;  
    int rcvlength;
    rcvlength = sizeof(struct my_msg) - sizeof(long int) ;
    return msgrcv(msgid, msg, rcvlength, msg->my_msg_type, 0);
}

错误二、char数组未初始化直接进行操作导致出现错误字符

这个代码的功能是:定义一个char数组,用来保存收到的data:sqe_str[sqe_index].data,当index==6的时候,把这个字符串打印出来,但是打印出来的字符串第一个字符是错误的,代码如下:

char real_str[30];
//省略部分代码
strcat(real_str, sqe_str[sqe_index].data);//data是一个int类型数组
sqe_index ++;
if(sqe_index == 6)
{
    printf("%s\n",real_str);
    break;
}

strcat实现函数如下:glibc/string/strcat.c

char *
STRCAT (char *dest, const char *src)
{
    strcpy (dest + strlen (dest), src);
    return dest;
}

定义real_str改成

char real_str[30] = {0};

问题解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值