我正在嘗試編寫一個接收消息並讀取它們的程序。根據這些消息是什麼,然後打印出一些文本。因爲這是valgrind警告我的代碼的一部分,所以我把它留在那裏讓你看。據我在網上閱讀,應該有一個初始化問題,但我不知道在哪裏。Valgrind錯誤:條件跳轉或移動取決於未初始化的值(s) - C
int main(int argc, char* argv[])
{
int oprimek = 0;
char name[] = "/cmdQueue";
char msg[255];
msg[256]='\0';
char submsg1[5];
submsg1[6]='\0';
char submsg2[250];
submsg2[251]='\0';
int len=0;
int x=0;
struct mq_attr atr;
atr.mq_maxmsg = 5;
atr.mq_msgsize = 255;
oprimek = mq_open(name,O_RDWR|O_CREAT|O_EXCL,0660, &atr);
if(oprimek == -1){
perror("error");
mq_unlink(name);
return -1;
}
time_t sek;
int size=0;
while(1){
mq_getattr(oprimek,&atr);
if(atr.mq_curmsgs>0){
size=mq_receive(oprimek, msg, atr.mq_msgsize,0);
if(size==0){
printf("Length is 0.");
}else{
len=strlen(msg);
msg[len]='\0';
strncpy(submsg1,msg,5);
submsg1[5]='\0';
if(strcmp(msg, "datum")==0){
time(&sek);
printf("%s", ctime(&sek));
}
else if(strcmp(submsg1,"izpis")==0){
x=0;
while(x<len){
submsg2[x]=msg[5+x+1];
x++;
}
printf("%s\n",submsg2);
}
else if(strcmp(msg,"zakljuci")==0){
printf("Turning off!\n");
return 1;
}
else{
printf("Unknown message: %s \n",msg);
}
}
}
}
mq_close(oprimek);
mq_unlink(name);
return 0;
}
你應該真的檢查你的數組邊界。你在他們外面寫着多個地點。例如'char msg [255]; msg [256] ='\ 0';'。你已經定義了一個有255個元素的數組,第一個開始msg [0],最後一個是msg [254]。同時,您正在爲msg [256]分配一個值,該值位於數組邊界之外。這可能會導致分段錯誤,您正在寫入未分配給程序的內存。或者它可能會寫入其他分配給您的程序的內存,這可能導致未定義的行爲。 –
此代碼'len = strlen(msg); msg [len] ='\ 0';'是徒勞的,因爲'strlen'無論如何都不能在沒有所需的字符串終結符的情況下工作。 –
謝謝你的幫助。我修復了陣列,但錯誤仍然存在。 – KatKit