在做毕业设计的过程中,遇到了几个错误导致结果不对,在这里做一个总结
毕业设计主要的开发语言是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};
问题解决。