【发布时间】:2020-12-21 04:34:29
【问题描述】:
如标题中所述,我已成功取消引用进出 modMYSTRUCT 和 showMeThis 函数的数据。显示“Fourth check”之前的正确输出,但出现段错误:
First check
Second check
0
Third check
Segmentation fault (core dumped)
但是,当我从(cout << "First check\n"; 到 cout << "Third check\n";)或从(MYSTRUCT struct_inst; 到 cout << "Fourth check\n";)发表评论时,这不会发生。当我这样做时,代码会为未注释的代码生成预期的输出。
上述产生段错误的代码:
struct MYSTRUCT
{
int * num;
};
void modMYSTRUCT( MYSTRUCT * struct_inst )
{
cout << *(struct_inst->num) << endl;
*(struct_inst->num) = 2;
}
int showMeThis( int * x )
{
return *x;
}
int main()
{
cout << "First check\n";
int x[1][1] = { {0} };
cout << "Second check\n";
cout << showMeThis(&(**x)) << endl;
cout << "Third check\n";
MYSTRUCT struct_inst;
*(struct_inst.num) = 1;
modMYSTRUCT(&struct_inst);
cout << *(struct_inst.num) << endl;
cout << "Fourth check\n";
}
我在这里一无所知。对于上下文,我正在寻找一种更好的方法来取消引用 GLM 矩阵。有什么想法吗?
【问题讨论】:
-
您是否尝试过单步调试器?
-
struct_inst.num从未初始化,因此您的程序具有未定义的行为。这意味着它可能会起作用,或者可能会不一致地起作用,或者可能根本不起作用。 -
你能解释一下这段代码应该完成什么吗?这是一个玩具示例,但玩具的目标是什么?从高层次开始,逐步深入了解更多细节,以及explain to your rubber duck 为什么您的代码中不会出现错误。一定要想象你的鸭子在每次解释后都怀疑地看着你。 ;)
-
刚才和常规编译不同的是,它在从
cout << "First check\n";到cout << "Third check\n";的评论时产生了段错误。 -
@JaMiT 这是一个从双缓冲数组传递单个元素地址的实验(我现在也知道,
&(**x)有点多余,除非我指的是任何一个元素除了数组的每个维度的第一个之外的索引)。幸运的是,调试器和@1201ProgramAlarm 让我想到了struct_inst.num的初始化。我现在看到我正在为未分配的内存区域分配一个值。为什么这始终以前面描述的方式导致段错误?¯\_(-_-)_/¯...就像@1201ProgramAlarm 所说,“不一致”。
标签: c++ arrays struct segmentation-fault dereference