c++ - 访问传递给函数的二维数组的段错误

标签 c++ arrays pointers

我正在使用 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/

相关文章:

c++ - 新手 c++ 将列表迭代器转换为 POD 类型

c++ - 你如何关闭 xcode 5 上的 zerolink?

c++ - C++ 中的转换和指针转换

c++ - 重载函数调用在 C++ 中如何工作?

c++ - 我的广度优先算法无法正常工作

c - 如何在 C 中正确分配结构数组 HashMap 中的项

c# - items.IndexOf 不打印位置

jQuery - 数组元素上的迭代 + addClass

c - 使用指针函数的程序方差和标准差

带指针的 calloc() 语法声明