【问题标题】:cpp double pointer vs 2 dimensional array pointercpp 双指针 vs 二维数组指针
【发布时间】:2019-11-14 19:08:52
【问题描述】:
#include <iostream>

int main() {
    int a[2][2] = {{1,2}, {3,4}};
    int *c = *a;
    int **b = &c;
    std::cout << **(a+1);  // outputs 3
    std::cout << **(b+1);  // segmentation fault
}

为什么一个 cout 会导致分段错误而另一个不会?他们不应该指的是相同的价值吗?

【问题讨论】:

  • std::array 和/或std::vector 有什么问题?这些天,C 风格的数组看起来很“古怪”..

标签: c++ pointers dereference


【解决方案1】:

让我们从

开始
int *c;

其实之前的东西没那么重要,因为c只是一个指针然后就到这里了

int **b = &c;

您将c 的地址存储在b 中。 c 的地址与c 中存储的值无关。 c 只是一个指针,获取它的地址不会让你神奇地访问二维数组。

cout << **(b+1); // segmentation fault

b+1 已经是未定义的行为。取消引用该指针无法为您提供有意义的东西。

PS: tbh 我不能告诉你如何在这里正确使用双指针。一旦我开始学习 c++,我就忘记了关于通过指针处理数组的任何知识。使用std::vectorstd::array 并省去一些麻烦。

【讨论】:

    【解决方案2】:

    在此声明中

    cout << **(b+1);
    

    表达式b+1 指向数组之外(更准确地说是在对象c 之外)。你应该写

    cout << *( *b + 2 );
    

    取消引用的指针b 指向指向二维数组第一个元素的指针。当向它添加 int[2] 类型数组中的元素数量时,您将获得指向二维数组第二“行”的第一个元素的指针。现在您需要再次取消引用它以输出指向的值。

    【讨论】:

    • 有道理,编译器如何跟踪数组指针的这些信息?因为它不会引发分段错误
    • @RohithYeravothula 对不起。我没看懂这个问题。
    【解决方案3】:

    我重写了代码以突出显示正在发生的事情,如下所示:

    #include <iostream>
    
    int main() {
      int a[2][2] = {{1,2}, {3,4}};
      int *c[2] = {a[0], a[1]};
      int **b = c;
    
      std::cout << **(a  ) << ','; // outputs 1
      std::cout << **(b  ) << ";\n"; // outputs 1
      std::cout << **(a+1) << ','; // outputs 3
      std::cout << **(b+1) << ";\n"; // outputs 3
    }
    

    链接:https://ideone.com/ixj3NV

    更新链接https://ideone.com/g7jjVN (澄清原始来源以扩展程序)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 2017-06-11
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多