【问题标题】:C++ segmentation fault while passing address values between functions在函数之间传递地址值时出现 C++ 分段错误
【发布时间】:2013-02-18 13:31:35
【问题描述】:

我正在尝试编写一个简单的 C++ 算法来解决数独问题。我正在尝试在不同函数之间传递地址值,但在运行时出现分段错误。 (不用说,我不是很有经验:))

代码确实设法将 a[0] 的地址传递给 main 函数,我可以使用 main 中的指针读取值。当我尝试传递地址来解决函数时,它给出了分段错误。

(也作为次要问题,我可以在 main 中正确读取值,使用 cout

#include <iostream>
using namespace std;

int * get_input();
void solve(int *);

int main()
{
    int * a;
    a = get_input();
    //cout << *a << " " << *(a+1) << " " << *(a+2) << " " << *(a+3) << " " << *(a+4);
    //for (int i = 0 ; i < 81 ; i++) {if (i%9 == 0) cout << "\n"; cout << a[i] << " ";}
    solve(a);
    return(0);
}

int * get_input ()
{
    int a[81];
    getinput:
    for (int i = 0 ; i < 81 ; i++)  {a[i] = 0;}
    for (int i = 0 ; i < 81 ; i++)  {cin >> a[i];}
    print:
    for (int i = 0 ; i < 81 ; i++)
    {
        if (i%27 == 0){cout << "\n";}
        if (i%9 == 0) {cout << "\n";}
        if (i%3 == 0) {cout << "  " << a[i];}
        if (i%3 != 0) {cout << a[i];}
    }
    cout << "\n\nCheck:\n1- Fix\n2- Reset\n3- Confirm\n\n";
    int check = 0;
    cin >> check;
    if (check == 1)
    {   
        int input[3] = {-1, -1, -1};
        while (true)
        {
            cin >> input[0] >> input[1] >> input [2];
            if (input[1] == 0) goto print;
            a[(input[2]-1)+((input[1]-1)*9)] = input[0];
        }
    }
    if (check == 2) goto getinput;
    if (check == 3) return a;
}

void solve(int * a)
{
    bool matrix[9][9][9];
    for (int i = 0 ; i < 81 ; i++) {for (int j = 0 ; j < 9 ; j++) {matrix[(i-i%9)/9][i%9][j] = true;}}
    for (int i = 0 ; i < 81 ; i++)
    {
        if (a[i] == 0) continue;
        else
        {
            for (int j = 0 ; j < 9 ; i++)
            {
                matrix[(i-i%9)/9][j][a[i]] = false;
                matrix[j][i%9][a[i]] = false;
                matrix[((i-i%9)/9)-((i-i%9)/9)%3+j%3][i%9-(i%9)%3+(j-j%3)/3][a[i]] = false;
            }
        }
    }
    for (int i = 0 ; i < 9 ; i++)
    {
        for (int j = 0 ; j < 9 ; j++)
        {
            cout << matrix[i][j][1] << " ";
        }
        cout << "\n";
    }
}

【问题讨论】:

  • 在快速运行之后,我会说它是 return a in get_input 。您不能返回指向堆栈变量的指针,而是使用 malloc/new 分配它并返回它。
  • 关闭过于本地化。
  • Arrays, goto, ... 你确定你的意思是 C++ 吗?
  • 它使用 C++ IO...

标签: c++ pointers fault


【解决方案1】:

您正在将地址返回到getInput(数组a)中的局部变量。我建议你将数组作为参数传递给这个函数。另一种选择是动态分配数组,然后在程序终止之前释放它。

【讨论】:

    【解决方案2】:

    在您的get_input() 函数static 中创建a 数组:

    int a[81];
    

    应该是

    static int a[81];
    

    这是因为 static 关键字确保分配的内存块(数组 a )将在函数返回后保持分配状态。通常这是“因为我还没有完成它”(例如,您可以计算您的函数以这种方式调用了多少次),但它也可以合法地用于确保函数的返回值在函数结束后仍然存在。

    最好在main 级别声明数组,并将指向它的指针传递给get_input()solve() 函数。这样你就可以在代码中明确表明数组将“在程序的持续时间内存在”——这通常是一种很好的做法。

    【讨论】:

    • 我不能否认...但是由于“到目前为止的谜题”应该一直存储在内存中,所以静态也不错。最好放在顶层而不是函数中。
    • 当然。我明白它为什么会起作用,我也明白你的理由,我就是无法摆脱那种感觉有点讨厌的感觉:P。不过可能值得添加为什么这行得通。
    • 通过函数访问静态是完全合法的,甚至是可取的,因为在某些情况下(不是这个)它巧妙地避免了静态初始化失败。使用像这样的静态的唯一问题是与线程和重入有关,在这种情况下我认为这不是问题。
    • 谢谢,我会试试这个。这是我在 stackoverflow 中的第一个问题,老实说,我对在这么短的时间内给出了多少合法响应感到不知所措:)
    • @cem - 不客气。作为新用户,您永远无法完全知道您是否会在一分钟内被否决并关闭,或者在五分钟内获得 5 个有用的回复。你走运了!顺便说一句-请学习如何编写不需要“goto”的结构化循环-这很少是正确的方法(尽管可以)。见stackoverflow.com/questions/245742/…
    【解决方案3】:
    int a[81];
    

    这是一个本地内存分配,当你的函数 get_input 返回时它被释放。

    改用指针int* amalloc函数来动态分配内存!

    malloc 命令可能是这样的(如果我没记错的话):

    int *a = (int *) malloc(sizeof(int)*81);
    

    【讨论】:

      【解决方案4】:

      你的问题是你正在返回一个指向本地声明变量的指针。不要这样做。您应该将变量作为参数传递(例如 get_input(int[] arr, int length)` 或在堆上为您的数组分配新内存。最简单的是前者,后者可能会给您带来麻烦必须管理你的内存,否则你会得到内存泄漏。

      为什么需要这样做?当您在 get_input 中声明 a[] 时,它会在堆栈上为该变量分配空间。堆栈是一个长的连续内存块,用于存储函数的参数、局部变量和调用当前函数的程序的地址。当一个函数返回时,所有这些内存都会被回收以供下一个函数调用使用。也就是说,当solve 被调用时,它开始在堆栈上写入之前由get_input 使用的内存。

      您很幸运遇到了分段错误,因为有时即使程序的数据已完全损坏,程序仍可能继续运行。

      综上所述:在main函数中声明你的数组,并传递给get_input进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-20
        相关资源
        最近更新 更多