Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 分段错误,使用指针到指针_Pointers_Segmentation Fault_Multidimensional Array - Fatal编程技术网

Pointers 分段错误,使用指针到指针

Pointers 分段错误,使用指针到指针,pointers,segmentation-fault,multidimensional-array,Pointers,Segmentation Fault,Multidimensional Array,因此,我开始我的幻方hw,在这里我要求用户输入一个奇数整数,它将创建一个幻方。我必须使用指针和数组,因为到目前为止我只学到了这些。不是问如何做幻方,而是什么导致了分割错误,我可能没有正确地做指向2d数组的指针 #include <iostream> using namespace std; int main() { int **ptr; int odd; do { cout << "Enter a odd number to create a magic sq

因此,我开始我的幻方hw,在这里我要求用户输入一个奇数整数,它将创建一个幻方。我必须使用指针和数组,因为到目前为止我只学到了这些。不是问如何做幻方,而是什么导致了分割错误,我可能没有正确地做指向2d数组的指针

#include <iostream>
using namespace std;

int main()
{
int **ptr;
int odd;
do 
{
    cout << "Enter a odd number to create a magic square: ";
    cin >> odd;
}while(odd % 2 != 1);

ptr = new int *[odd]; //creates a new array of pointers to int objects
for(int i = 0; i < odd; i++)
    ptr[i] = new int[odd];

//set it all to 0
for(int i = 0; i < odd; i++)
{
    for (int j = 0; j < odd; j++)
    {   
        ptr[i][j] = 0;
        cout << ptr[i][j];
    }
}
int row = odd;
int column = odd / 2;
int lastrow = row;
int lastcolumn = column;

//begin adding numbers to magic square
ptr[row][column] = 1;
for (int i = 2; i < odd * odd; i++)
{

}

//delete
for(int i = 0 ; i < odd; i++)
    delete [] ptr[i];
delete [] ptr;
return 0;
}
#包括
使用名称空间std;
int main()
{
int**ptr;
int奇数;
做
{
cout>奇数;
}而(奇数%2!=1);
ptr=newint*[odd];//创建指向int对象的指针的新数组
for(int i=0;i<奇数;i++)
ptr[i]=新整数[奇数];
//将其全部设置为0
for(int i=0;i<奇数;i++)
{
对于(int j=0;j<奇数;j++)
{   
ptr[i][j]=0;

cout当您遇到分段错误时,要做的第一件事是获取调试器并准确跟踪分段错误发生的位置,或者(更简单的是)在代码中向cerr添加大量打印输出,以便您可以看到有多少代码在分段错误发生之前被执行


附加提示:使用cerr而不是cout,以避免缓冲,否则可能会使您无法看到错误之前应获得的某些输出,并且始终在每个打印输出中添加一个换行符,以避免在运行程序的shell中的下一个提示将其打断。

当您获得分段f时要做的第一件事ault要么抓取一个调试器并精确跟踪segfault发生的位置,要么(更简单),在代码中向cerr添加大量打印输出,这样您就可以看到有多少代码在segfault发生之前被执行


附加提示:使用cerr而不是cout,以避免缓冲,否则可能会阻止您看到错误之前应该得到的某些输出,并且始终在每个打印输出中添加一个换行符,以避免在运行程序的shell中的下一个提示将其击杀。

int row=odd;
应为
int row=odd-1;


稍后将使用行进行索引,因此您将得到数组[size\u of\u array],它总是超出范围。

int row=odd;
应该是
int row=odd-1;

稍后您将使用row进行索引,因此您将得到数组[size\u of\u array],它总是超出范围。

这是:

ptr[row][column] = 1;
访问超出边界的数组(提示:ptr[row]在大多数malloc实现中可能为NULL)。

这:

ptr[row][column] = 1;

访问超出边界的数组(提示:ptr[row]在大多数malloc实现中可能为空)。

gdb能够准确地告诉您segfault发生的时间,并允许您打印其中的数据。这可能是确定segfault发生位置的最佳选择


使用-g编译程序(假设您使用GCC)

gdb能够准确地告诉您segfault发生的时间,并允许您打印其中的数据。这可能是确定segfault发生位置的最佳选择


使用-g编译程序(假设您使用GCC)

这可能是正确的,但由于问题与家庭作业有关,我认为告诉Raptrex如何找到错误实际上比告诉他错误在哪里更有用……这可能是正确的,但由于问题与家庭作业有关,我认为告诉Raptrex如何找到错误实际上比告诉他更有用告诉他错误在哪里。。。