簡體   English   中英

為什么我的C程序在每次執行時都更改輸出而沒有任何輸入或代碼更改?

[英]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;

這些將自動添加到具有自動存儲持續時間的內存中,一旦聲明內存的作用域終止,該內存將不再存在-像您那樣在范圍之外訪問它是未定義的行為。

解決方案是使用*allocmalloc / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM