c - 调用正确的函数时发生段错误

标签 c segmentation-fault

我正在解决 0-1 背包问题。 我通过暴力算法解决了这个问题。

在main.cpp中

  int main(int argc, char *argv[])
  {
     ......
     int solution;
     solution = bruteForce();
     ......
  }

奇怪的是,当我在 main.cpp 中实现 bruteForce() 时,我的程序工作正常,但是,在我将 bruteForce() 移动到 bruteForce.cpp 并将其包含在 main.cpp 中后,程序将生成调用 bruteForce() 时出现段错误。

以下是我如何将 bruteForce() 移动到 bruteForce.cpp。 首先我创建了一个头文件functions.h(因为我想在暴力破解成功后通过其他方法解决问题)

  functions.h:

  #include "global.h"
  int bruteForce();
  int multiplication( int );

然后我将 bruteForce() 移至 bruteForce.cpp

  #include <iostream>
  #include <stdlib.h>
  #include <vector>
  #include "global.h"
  #include "functions.h"

  using namespace std;

  int bruteForce()
  {
     int bestValue = 0;
     int j, tempSize, tempValue;
     int bestChoice[n+1];

     for(int i=0; i<multiplication(n); i++)
     {
         tempSize = 0;
         tempValue =0;
         j = n;

         while(x[j]!=0 && j>0)
         {
             x[j] = 0;
             j--;
         }
         x[j] = 1;

         for(int k=1; k<=n; k++)
         {
             if(x[k] == 1)
             {
                 tempSize += size[k];
                 tempValue += value[k];
             }
         }


        if((tempValue > bestValue) && (tempSize <= S)) 
        {   
            bestValue = tempValue;
            for(int p=1; p<=n; p++)
                bestChoice[p] = x[p];
        }
    }
    for(int p=1; p<=n; p++)
       x[p] = bestChoice[p];

    return bestValue;
 }

在global.h中,我声明了一些全局变量:

  #include <vector>
  using std::vector;

  static int n, S;
  static vector<int> value, size, x;

gdb 调试器显示

  Program received signal SIGSEGV, Segmentation fault.
  0x08049308 in main()

知道为什么会发生这种情况吗?

提前致谢。

哦,顺便说一句,如果您需要更多信息,这里是 package 。 您可以首先在此包的根目录中键入 make 。然后输入此命令来执行。

  ./bin/01knapsack -BF inputs/n5S11.in n5s11.out

最佳答案

您不应该将变量放在头文件中。当您从两个源文件中包含该变量时,两者都将获得该变量的自己的单独副本 - 因此您将无法以您认为的方式在函数之间传输数据(或者至少,这是我对它应该如何进行的理解)工作 - 我承认我不能 100% 确定实际发生的情况)。

将数据传输到函数的最佳方法是使用参数。使用所需的任何内容调用函数,并通过函数返回值或通过指针或引用参数返回数据。对此类内容使用全局变量很容易出错(如您所见),并且对于查看您的代码的其他人来说,这不太清楚。

如果您绝对想使用全局变量,请在文件中声明它们,并将它们放入带有 extern< 的全局头文件中/em> 前面的语句。然后,当您包含来自另一个文件的 header 时,extern 告诉编译器它实际上不应创建变量本身,而是由另一个目标文件提供。

所以,在 main.cpp 中:

int n, S;
vector<int> value, size, x;

在 global.h 中:

extern int n, S;
extern vector<int> value, size, x;

关于c - 调用正确的函数时发生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956381/

相关文章:

arrays - C 中权重 [a]= 数据上的段错误;

c - TCP 通信中的段错误

c - 将函数分配给C中的函数字段

C 编程温度转换

c - 循环整数范围的最小值

c++ - 在 C 和 C++ 中更改控制台输出的背景颜色

c - 从 C 中的函数返回数组 : Segmentation Fault

关于指针使用的说明

c++ - C中的MAX和MIN是什么? #定义函数

c++ - 调试 Boost 序列化段错误问题