我在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));
}
答案 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中,一旦从函数返回,局部变量将被销毁。既然你没有返回任何东西,你就不会在主要陈述中得到适当的结构。