我正在使用 Code:Block。
编译了以下代码(没有错误)并在运行时出现段错误。
void print(int size, int **a)
{
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
cout<<a[i][j]<<" ";/**Segmentation fault here**/
}
cout<<endl;
}
}
int main()
{
int a[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int size = sizeof(a)/sizeof(a[0]);
print(size,(int **)a);
return 0;
}
我尝试使用不同的方法传递数组:
void print(int size, int a[][4])
{
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int a[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int size = sizeof(a)/sizeof(a[0]);
print(size,a);
return 0;
}
没有错误,代码运行成功。
对于第一个代码而不是使用 a[i][j]
,我尝试使用 *(*(a+i)+j)
,出现段错误.
然后我在段错误点调试了第一段代码并吸收了以下内容:
> p a
$1 = (int **) 0x22fd30
> p *a
$2 = (int *) 0x200000001
> p **a
Cannot access memory at address 0x200000001
我相信 a
保存二维数组的首地址。但对于 p **a,错误消息中显示了不同的地址。
然后我运行了 http://ideone.com/ 中的第一个代码并遇到运行时错误。我在哪里犯错?以及为什么调试器显示不同的地址?
最佳答案
在你的第一个例子中
void print(int size, int **a)
期望类型为 pointer to pointer to pointer to int 的第二个参数。但是在这里
int a[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
print(size,(int **)a);
您传递了一个4 个整数数组的数组 类型的变量。当您将数组传递给函数时,数组衰减为指向其第一个元素的指针。所以实际上函数 print
获取类型为 int *[4]
的参数 - 指向 4 个整数的数组 这不是 print
期望。那是一个错误。您向编译器隐藏此错误,告诉他 a
的类型为 int **
。它没有。因此出现段错误。
在你的第二个例子中
void print(int size, int a[][4])
需要一个类型为 4 个整数的数组 的参数。当传递给 print
函数时,它会衰减为 int *[4]
,这正是 a
的类型。这里没有错误。
关于c++ - 访问传递给函数的二维数组的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26031730/