0

我正在使用 C。我有一个主文件,它指向一个头文件。我将把前者称为“主要”,将后者的实现称为“补充”。现在,当我的 Main 文件运行时,它会从我的 Supplement 中调用一个函数。

该函数 malloc 并编辑了一个全局变量(在我的补充文件中)。继续前进,我再次从我的补充文件中调用另一个函数。

现在这就是问题所在,因为每当我这样做时都会收到分段错误。使用 gcc,我发现在我对 Supplement 的第二次函数调用期间,我编辑的全局变量似乎“消失了”(打印显示它位于 0x0 地址并且无法访问。)

我是 C 的新手,我知道全局变量不好,但这是一个赋值,因为我们不能编辑主文件,我只能在我的补充文件中使用一个全局变量来让它“记住”我的 var。

剪切代码:

Main:
  // call load
 // check

Supplement:

    typedef struct node
{
    bool is_word;
    struct node* children[27];
}node;

//Root Node
static node* root = NULL;

bool check(const char* word)
{
  //edits word and puts it into input[i](as int)
  for(int i=0;i<x;i++)
    { 
       //uses root[input[i]] -this is the problem. Apparently root is 0x0.
    }
}

bool load(const char* dictionary)
{
     //mallocs and edits root. Note that it is quite a handful. Do note that in the context of this function, gdb returns seems to know root. It's just on the check function call that it mysteriously disappears.

//current = root

node* cur = root;
root = malloc(sizeof(node));

//Check if opened
if(dict==NULL)
{
    return false;
}else
{
    int ch = getc(dict);
    while(ch!=EOF)
    {
        //if character is newline
        if(ch==10)
        {
            cur->is_word = true;
            cur = root;
            dSize++;
        }else{
            int value = (ch==APOST)? 26 : ch-ASCII;
            //if there are no nodes yet
            if(cur->children[value]==NULL)
            {
                //make a new node
                node* next = malloc(sizeof(node));
                //point children to node
                cur->children[value]= next;  
                //current becomes new node
                cur= next;
            }else{
            //else, use node
                cur=cur->children[value];
            }
        }
        ch = getc(dict);
    };
    return true;
}

}

我实际上是在设置根变量。我不确定为什么我的代码会引起这样的评论。我也通过在 gdb 上打印 root 来确认这一点。唯一的问题是加载完成后,我正在运行检查,root 消失了。提前致谢!

4

2 回答 2

1

我不知道为什么您在特定情况下会出错,因为您没有显示代码。但是,正确的方法是:

主程序

#include "supp.h"
#include <stdio.h>

int main()
{
  set_x (5);
  printf("%d", get_x());
  return 0;
}

支持.h

#ifndef SUPP_H
#define SUPP_H

void set_x (int n);
int  get_x (void);

#endif /* SUPP_H */

支持c

#include "supp.h"

static int x;

void set_x (int n)
{
  x = n;
}

int get_x (void)
{
  return x;
}

此代码在 c 文件中使用“文件范围”静态变量。您不能直接从任何其他文件访问 x。这称为私有封装,这始终是良好的编程实践,也是面向对象程序设计概念的一部分。

于 2013-01-31T10:28:35.077 回答
0

没有理由使用全局变量,您可以在 main() 中声明变量,然后将对该变量的引用提供给使用它的函数

bool load(node** root, const char* dictionary);
bool check(node* root, const char* word);

int main()
{
  node* root = NULL;

  load(&root, dictionary);

  ...
  if ( check(node,word) ) 
  {
  ...
  }
}
于 2013-01-31T11:34:52.340 回答