C不会将数据放入数组或变量中

时间:2017-06-15 06:02:53

标签: c arrays linux variables

我是C编程的初学者<现在我正在使用linux并尝试了gcc和clang编译器。但是,我遇到了一个问题,有时C不会将数据放入数组或变量中。例如,我的一个简单代码不能完全运行:

    #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,有时是,有时没有,即使声明和函数是相同的。有人告诉我,这可能是编译器的问题,但我尝试了不同的,也有一个朋友使用相同的Kali linux,因为我在另一台PC上面对这个问题。

1 个答案:

答案 0 :(得分:2)

您需要将指针传递给struct,即int create (struct stack *s)而不是int create (struct stack s)push也是如此。否则,您传递副本并在函数中,您将更改副本而不是主要传递的对象。

有时它至少部分工作的原因是,当按值传递对象时,这些值将临时放在堆栈上;似乎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)中,我将s声明为const,因为该函数无意更改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;
    }
}