gpt4 book ai didi

c - 调用 yylex() 后全局指针设置为 NULL

转载 作者:行者123 更新时间:2023-11-30 18:49:33 28 4
gpt4 key购买 nike

我在 Flex 文件的定义部分中声明全局作用域指针时遇到问题,然后我在主文件的开头 malloc 它,但是 < strong>一旦我的程序运行到yylex()指针的值就会设置为NULL

我在整个程序中都需要这个指向struct(这是struct Modele * model)的指针,它基本上是一个指向我存储所有结果的结构的指针文件,所以我实际上不能没有它,至少不能没有一个指向在 main()yylex() 中都可以正常工作的结构的指针。

执行时,程序遇到段错误,尝试在地址 0x4 处写入;在 valgrind 下运行程序,并打印 model 的值,让我了解到内存已正确分配,但是一旦调用 yylex,model 的值就变成了NULL(打印(nil))。我在这里没有使用任何 header ,但我尝试使用一个 header 来存储我的所有结构以及全局范围变量的声明,但没有成功。

我的问题是:面对这样的行为我做错了什么?通常避免出现此问题的最佳方法是什么?我不确定我是否曾经使用过全局范围指针,所以可能是这个,或者可能是 Flex-lex 特定的问题......我有点迷失了!

这是我的代码示例:

%{

#include <stdlib.h>
#include <stdio.h>
//some more includes and #defines

typedef struct Doc {
int classe;
uint32_t * words;
int current_index;
int current_size;
} doc;

typedef struct Modele {
int nb_classes;
int nb_docs;
int nb_docs_base;
int nb_docs_test;
int base_or_test;
int voc_size;
int M_test_size;
liste ** M_theta;
row_info * M_calc;
doc * M_test;
} modele;
//some more typedefs

modele * model; // <--- this is the pointer i talk about

//some more functions bodies .....
%}

couple_entiers [0-9]+:[0-9]+
// .......
%%

{couple_entiers} { model->nb_docs ++}
//.....

%%

int main (int argc, char ** argv)
{
// .....
modele * model = malloc(sizeof model); // <---- here is the malloc
model->nb_classes = 0;
model->nb_docs = 0;
model->nb_docs_base = 0;
model->nb_docs_test = 0;
model->voc_size = 0;
model->M_test = malloc (TAB_SIZE * sizeof(doc));
//....
if ((yyin = fopen(argv[1],"r")) == NULL){
printf("Impossible d'ouvrir %s !\n",argv[1]);
exit(0);
}

yylex();

如果那段代码不足以捕获问题的根源,我会粘贴更多的代码,我只是想选择相关的部分。

最佳答案

My question is : what did I do wrong to face such a behavior ?

您从未设置过文件范围变量。您的 main() 函数而是声明并初始化一个具有相同名称和类型的本地变量。本地声明“隐藏”其范围内的文件范围声明。

要修复它,只需更改此...

    modele * model = malloc(sizeof model);

...对此:

    model = malloc(sizeof model);

如果变量名前面没有类型,那么您引用的是在其他地方声明的变量(在本例中是在文件范围内)。

关于c - 调用 yylex() 后全局指针设置为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42518896/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com