[英]C++ segmentation fault while passing address values between functions
我正在尝试编写一个简单的C ++算法来解决数独问题。 我正在尝试在不同的函数之间传递地址值,但在运行时遇到分段错误。 (不用说,我不太有经验:)
该代码确实设法将a [0]的地址传递给main函数,并且我可以使用main内部的指针读取值。 当我尝试传递地址来解决函数时,它给出了分段错误。
(作为第二个问题,我可以正确地使用cout << *(a + 5)等在main中正确读取值(在main中注释),但是当我尝试打印使用for循环存储的所有81个值时,它给出了无意义的值(再次,在代码中注释掉了。)该代码可与*(a + 3)或a [3]之类的文字一起使用,但在int涉及到int(int i,what)cout <<时不起作用*(a + i);)
#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";
}
}
您正在将地址返回到getInput
(数组a
)中的局部变量。 我建议您将数组作为该函数的参数传递。 另一个选择是动态分配数组,然后在程序终止之前小心释放它。
使get_input()
函数中a
数组成为static
数组:
int a[81];
应该
static int a[81];
之所以可行,是因为static
关键字可确保在函数返回后,分配的内存块(数组a
)将保持分配状态。 通常这是“因为我还没有完成它”(例如,您可以算出这种方式调用函数的次数),但是它也可以合法地用于确保函数的返回值在函数末尾幸免。
最好在main
级别声明该数组,然后将指向它的指针传递给get_input()
和solve()
函数。 这样一来,您就可以在代码中明确指出数组将“在程序运行期间内存在”-这通常是一种好习惯。
int a[81];
这是一个本地内存分配,当您的函数get_input
返回时释放它。
使用指针int* a
和malloc
函数来动态分配内存!
malloc命令可能是这样的(如果我记得很好):
int *a = (int *) malloc(sizeof(int)*81);
您的问题是您正在返回指向本地声明的变量的指针。 不要这样 您应该将变量作为参数传递(例如,get_input(int [] arr,int length)),或者在堆上为数组分配新内存。最简单的是前者,后者会使您遇到麻烦必须管理您的内存,否则您将发生内存泄漏。
为什么需要这样做? 在get_input
声明a []时,它将在堆栈上为该变量分配空间。 堆栈是一个很长的连续内存块,用于存储函数的参数,局部变量和调用当前函数的程序的地址。 当一个函数返回时,所有这些内存将被回收以供下一个函数调用使用。 也就是说,当调用solve
时,它将开始覆盖先前由get_input
使用的堆栈上的内存。
您很幸运遇到了段错误,因为即使程序的数据已完全损坏,有时程序仍可能继续运行。
总结:在主函数中声明数组,并将其传递给get_input
进行操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.