【问题标题】:What would be the issue here with the pointer?指针在这里会出现什么问题?
【发布时间】:2021-05-28 09:20:36
【问题描述】:

我一直在玩指针,我遇到了我的进程在使用传统窗口“没有响应”和退出代码 -1073741819 (0xC0000005) 完成后终止。

我的 IDE 建议的快速修复是使用 __p__fmode() 初始化 *ptr。

但是我读到,“__p__fmode 函数仅供内部使用,不应从用户代码中调用。”

如果你愿意帮我解决这个问题,请:)

#include <iostream>
    using namespace std;
    // Code written in Jetbrains's CLion with mingw-w64 compiler


int main() {
    int r, c, *ptr = __p__fmode(); // No idea what's that __p__fmode(), but without it process terminates
    // with code "Process finished with exit code -1073741819 (0xC0000005)"
    cout<<"Enter number of rows for Matrix A:";
    cin>> r;
    cout<<"Enter number of columns for Matrix A:";
    cin>> c;
    int A[r][c];
    A[0][0] = 0;
    A[0][1] = 1;
    A[1][0] = 2;
    *ptr = A[0][0];
    cout<<*(*(A+0)+0)<<"\t";
    cout<<*(*(A+0)+1)<<"\t";
    cout<<*(*(A+1)+0)<<"\t";

}

【问题讨论】:

  • 这个建议是无稽之谈,你应该忽略它。您需要 ptr 指向一些您可以实际写入的内存,例如ptr = new int;。无论如何,它的目的是什么?
  • 我被要求以涉及指针的方式填充二维矩阵。有点想自己弄清楚,但是嘿,它可以指向新的 int :) 谢谢
  • 作业可能要求您将non-Standard codeint A[r][c]; 的这一点替换为此处描述的内容:How do I declare a 2d array in C++ using new? 请注意,在实际编程中制作二维数组像这样可能会让你受到同龄人的嘲笑。使用std::vector,最好使用单个vector,即made to look like it is multi-dimensional
  • 注意:*ptr = A[0][0]; 很可能是程序崩溃的地方。如果ptr 没有指向任何东西,您就不能安全地取消引用指针*ptr,并分配给指针处的变量。该程序现在不会崩溃,因为 *ptr = __p__fmode(); 指向 ptr 某物,但它不是您想要覆盖的东西。重读教科书中关于指针使用的部分,刷新你对指针的理解。目前,您似乎手足无措,对基础知识掌握得太少,无法避免抓住错误的解决方案。
  • 顺便问一下,你用的是什么IDE?我很想知道如何得出这样一个快速修复建议是合适的结论。

标签: c++ arrays pointers matrix multidimensional-array


【解决方案1】:

但是我读到,“__p__fmode 函数仅供内部使用,不应从用户代码中调用。”

如果你愿意帮我解决这个问题,请:)

解决方法是不调用该函数。一般来说,除非您知道函数的作用,否则不要调用函数。


附言

cin>> r;
cin>> c;
int A[r][c];

数组的大小在编译时必须保持不变。示例程序在 C++ 中的格式不正确。

【讨论】:

    【解决方案2】:

    ptr未初始化时,语句

    *ptr = A[0][0];
    

    具有未定义的行为。未定义行为的一种可能(不保证)后果是程序异常终止 - 就像您看到的那样。

    函数__p__fmode()根据Microsoft documentation返回一个指向全局变量的指针。该函数返回一个int *,这表明(但不保证)涉及的全局变量类型为int

    因此,使用__p__fmode() 返回的值初始化ptr 意味着赋值*ptr = A[0][0] 会覆盖该全局变量。

    Microsoft 文档还声明“__p__fmode 函数仅供内部使用,不应从用户代码中调用。”。这意味着不建议使用它。

    您的代码还有一个次要问题(至少是您没有问过的问题) - 定义 int A[r][c]; 其中 rc 是变量,不是有效的 C++。如果您的编译器允许这样做,那么它就是一个非标准扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多