[英]Why does my C program changes the output in each execution without any input or code change?
我正在開發我的第一個C語言程序,它涉及兩個進程的通信。 從一個進程發送到另一個進程的消息的長度可能會有所不同,我需要存儲它們,直到接收者進程需要它為止。 我認為使用長度可以變化的FIFO結構會很好,因此我決定對其進行編程。 這是代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct Queue{
int length;
struct Member *first;
struct Member *last;
}Queue;
typedef struct Member{
char ch;
struct Member *next;
}Member;
Queue create(){
struct Queue cola;
cola.length = 0;
return cola;
}
void add(struct Queue *q, char c){
if(q->length == 0){
struct Member m;
m.ch = c;
q->first = &m;
q->last = &m;
}else{
struct Member m;
m.ch = c;
q->last->next = &m;
q->last = &m;
}
q->length++;
}
void print(struct Queue n){
struct Member *p;
p = n.first;
for(int i = n.length; i > 0; i--){
printf("%c,", p->ch);
p = p->next;
}
printf("\n");
}
int main(){
struct Queue cola = create();
add(&cola, 'a');
printf("%c\n",cola.first->ch);
printf("%c\n",cola.last->ch);
print(cola);
}
問題是,首先,當我嘗試打印隊列時,它無法按預期工作(我不知道這是print()函數還是結構本身的問題),但這是我要解決的問題可以自己找出來。 最大的問題(也是讓我找不到第一個問題的問題)是程序的答案有所更改。 這是我的終端機的副本:
$./list
a
a
p,
$./list
a
a
�,
$./list
a
a
,
$./list
a
a
0,
$./list
a
,
$./list
a
a
�,
所需的輸出將是:
$./list
a
a
a,
我不知道為什么會這樣,我想知道。 謝謝!
q->first = &m;
q->last = &m;
這些將自動添加到具有自動存儲持續時間的內存中,一旦聲明內存的作用域終止,該內存將不再存在-像您那樣在范圍之外訪問它是未定義的行為。
解決方案是使用*alloc
( malloc
/ calloc
等)動態分配內存,然后可以傳遞它們。 唯一的事情是,一旦使用完它們,您就需要釋放它們。 這樣的事情:-(是的,您可以/應該根據需要對其進行修改)
struct Member* m = malloc(sizeof *m);
if(!m){ perror("malloc");exit(EXIT_FAILURE);}
m->ch = c;
q->first = m;
q->last = m;
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.