struct中的附加变量在getter方法中导致错误的返回值

时间:2018-02-07 03:35:09

标签: c struct return-value getter

我在C编程方面很陌生,但我多年来一直在使用Java。我创建了一个包含两个变量的结构和一个getter方法(DFA_get_size)来返回值1。但是,当我添加第三个变量(注释掉的那个)时,函数DFA_get_size开始返回错误的数字。我不明白为什么会这样。请帮忙。

以下是整个计划。

#include<stdio.h>
#include <stdbool.h>

typedef struct DFA {
    int nstates;
    //int trans;
    int ai;
} DFA;

extern DFA DFA_new(int nstates){
    DFA dfa;
    dfa.nstates = nstates; 
    dfa.ai = 0;
}

extern int DFA_get_size(DFA dfa){
    return dfa.nstates; 
}

int main(){
    DFA test = DFA_new(8);
    printf("%d\n", DFA_get_size(test));
}

5 个答案:

答案 0 :(得分:4)

你实际上并没有从DFA_new返回任何内容。添加return dfa;,并在编译时(大多数编译器-Wall)启动警告。

答案 1 :(得分:0)

您在DFA_new中创建的DFA对象超出范围。你需要在new中malloc指向DFA对象的指针并返回它。或者将指向DFA对象的指针传递给DFA_new以初始化它。我认为你只是第一次幸运,只有两个结构成员。

答案 2 :(得分:0)

问题是您没有在DFA_new中返回值。但是,实际上,您也不想将结构作为参数或返回值传递。通常在C中你会传递一个指向结构的指针,所以你不必一直复制整个东西。

此代码解决了这个问题。

#include<stdio.h>
#include <stdbool.h>

typedef struct DFA {
    int nstates;
    int trans;
    int ai;
} DFA;

void DFA_new(int nstates, DFA * dfa){
    dfa->nstates = nstates; 
    dfa->ai = 0;
    dfa->trans = 0;  // might as well initialize this one too
}

extern int DFA_get_size(DFA * dfa){
    return dfa->nstates; 
}

int main(){
    DFA test;
    DFA_new(8, &test);
    printf("%d\n", DFA_get_size(&test));
}

答案 3 :(得分:0)

此函数中的dfa实例是函数的本地实例,因此一旦离开函数,它就不再存在,因为您没有从函数返回它。

DFA DFA_new(int nstates){
    DFA dfa;
    dfa.nstates = nstates; 
    dfa.ai = 0;
    /* missing return dfa; */
}

返回结构不是很有效,因为它复制了结构的内容。还有其他方法可以做到这一点:

在将变量传递给DFA_new

之前声明变量
DFA dfa;
int myNstates = 0;
int myAi = 0;
DFA_New(&dfa, myNstates, myAi ); // DFA_New(DFA*,int,int);

或在堆上分配DFA并将指针传递给该元素(完成后不要忘记释放它)

DFA* DFA_new(int nstates){
    DFA* dfa = malloc(sizeof(*dfa));
    if (dfa == NULL)
    {
       fprintf(stderr, "No memory\n" );
       abort();
    }
    dfa->nstates = nstates; 
    dfa->ai = 0;
    return dfa;
}

/* then later doing free() on the returned pointer */

答案 4 :(得分:0)

您在创建时未返回DFA:

extern DFA DFA_new(int nstates){
    DFA dfa;
    dfa.nstates = nstates; 
    dfa.ai = 0;
    return DFA;
}

在C中,一旦从函数返回,局部变量将被销毁。既然你没有返回任何东西,你就不会在主要陈述中得到适当的结构。