2017-06-15 29 views
0

我是C編程的初學者<現在我正在使用linux並嘗試使用gcc和clang編譯器。但是,我正面臨着一個問題,有時C不會將數據放入數組或變量中。例如,有一個我簡單的代碼中的一個,這完全不起作用:C不會將數據放入數組或數組var

#include <stdio.h> 
    #define size 10 

    struct stack{ 
     int structTop; 
     int elemNum[size]; 
    }; 

    int create (struct stack s); 
    int full (struct stack s); 
    void push (int elem, struct stack s); 


    void main() { 

struct stack s1; 
struct stack s2; 
struct stack s3; 
int a = 545; 
create(s1); 
push(a, s1); 
push(5, s1); 
push(a, s1); 
push(1, s1); 
push(6, s1); 
push(4, s1); 
push(7, s1); 
push(8, s1); 
int i = 0; 
while (i<4){ 
    printf("%d\n", s1.elemNum[i]); 
    i++; 
} 
    } 

    int create (struct stack s){ 
    s.structTop = -1; 
    return 0; 
    } 

    int full(struct stack s){ 
if(s.structTop == size-1) { 
    return 1; 
} 
else { 
    return 0; 
} 
    } 
    void push(int elem, struct stack s){ 
if(full(s)){ 
    printf("Stack is full"); 
} 
else { 
    s.structTop++; 
    s.elemNum[s.structTop]=elem; 
} 
    } 

作爲輸出我得到的數據,至極從一開始(零或隨機數)的內部數組。此外,它只是其中的一個代碼,我有幾個較大的代碼,也有同樣的問題。他們內部的變量和數組正在工作50/50,有時是的,有時不是,即使聲明和函數是相同的。有人告訴我,這可能是編譯器的問題,但我嘗試了不同的方法,並且還有一位與我一樣在不同的PC上面對此問題的Kali linux的朋友。

+2

C使用傳遞的價值。爲了有一個功能影響的變量,你要麼需要使用*返回值*函數的返回您分配給一個變量的信息,或者您有將指針傳遞給變量 –

+0

您正在修改原始(函數參數)本地副本的變量對原始文件沒有影響。 –

+0

[inden](https://en.wikipedi a.org/wiki/Indent_style)[tation...](http://mrbool.com/importance-of-code-indentation/29079) – ilkkachu

回答

2

您需要將指針傳遞給struct,即int create (struct stack *s)而不是int create (struct stack s)push也一樣。否則,你傳遞一個副本,並且在函數中,你將改變一個副本而不是原來從main傳遞的對象。

爲什麼它有時會起作用,至少部分是因爲按值傳遞對象時,這些值將暫時放在堆棧上;似乎來自main的同一個對象有好幾次被推到堆棧上的相同位置上,使得它看起來好像總是同一個對象。但是 - 正如你所認識的 - 這真的很偶然。

的你的方法應該是作爲簽名如下:

int create (struct stack *s); 
int full (const struct stack *s); 
void push (int elem, struct stack *s); 

注意 - 因爲現在傳遞指針 - 你必須使用->(而不是.)來訪問的s的元素,例如s->structTop = -1而不是s.structTop = -1;並且您必須傳遞堆棧的地址(不是堆棧本身,例如push(a, &s1)而不是push(a, s1)。 請注意,在int full (const struct stack *s)中,我宣佈sconst,因爲該函數不打算更改任何成員的值s

#include <stdio.h> 
#define size 10 

struct stack{ 
    int structTop; 
    int elemNum[size]; 
}; 

int create (struct stack *s); 
int full (const struct stack *s); 
void push (int elem, struct stack *s); 


int main() { 

    struct stack s1; 
    int a = 545; 
    create(&s1); 
    push(a, &s1); 
    push(5, &s1); 
    push(a, &s1); 
    push(1, &s1); 
    push(6, &s1); 
    push(4, &s1); 
    push(7, &s1); 
    push(8, &s1); 
    int i = 0; 
    while (i<4){ 
     printf("%d\n", s1.elemNum[i]); 
     i++; 
    } 
} 

int create (struct stack *s){ 
    s->structTop = -1; 
    return 0; 
} 

int full(const struct stack *s){ 
    if(s->structTop == size-1) { 
     return 1; 
    } 
    else { 
     return 0; 
    } 
} 
void push(int elem, struct stack *s){ 
    if(full(s)){ 
     printf("Stack is full"); 
    } 
    else { 
     s->structTop++; 
     s->elemNum[s->structTop]=elem; 
    } 
} 
+1

謝謝