C++ C++;:使用枚举类型进行迭代

C++ C++;:使用枚举类型进行迭代,c++,for-loop,enums,C++,For Loop,Enums,我有以下代码: for (i = 0; i <= WND_WRL; i++) { syslog(LOG_ERR, "TESTE i=%d WND_WRL=%d", i,WND_WRL); } for (i = 0; i <= WND_WRL; i++) { syslog(LOG_ERR, "OnScrDsp for i=%d WND_WRL=%d", i,WND_WRL); m_pWnd[i] = gtk_window_new(GTK_WINDOW_POPUP);

我有以下代码:

for (i = 0; i <= WND_WRL; i++) {
   syslog(LOG_ERR, "TESTE i=%d WND_WRL=%d", i,WND_WRL);
}

for (i = 0; i <= WND_WRL; i++) {
   syslog(LOG_ERR, "OnScrDsp for i=%d WND_WRL=%d", i,WND_WRL);
   m_pWnd[i] = gtk_window_new(GTK_WINDOW_POPUP);
   assert(m_pWnd[i]);
}
结构

在第一段代码中,我迭代到2(0,1,2),WND_WRL始终为2。问题在第二个代码中:即使WND_WRL曾经打印过2个值,for也会迭代i,直到接收到SIGV信号(11)并中断我的应用程序(这里它以i=384停止)。我能理解为什么384,我不关心这个

我不明白的是,为什么相同的条件提供不同的方式。如果我把WND_WRL改为2号,我会得到正确的代码和正确的应用程序执行

我的第一个想法是,第二个想法可能会改变WND_WRL值,但没有发生

我可以理解这段代码是否在错误的内存位置写入,但我总是看到WND_WRL的值为2

解决方案:


更改表达式“iVariable
m_pWnd
在源代码中定义为指针数组,大小为2,因此有效索引为0或1

GtkWidget *m_pWnd[WND_WRL];

但是你的循环发生了
i如何声明
m_pWnd
?你是否超出了数组的边界?@FranciscoPanisKaseker将此信息添加到问题中,而不是在评论中。(注意:如果移除优化标志“修复”了你的问题,听起来你的代码中好像有UB)@Thomas是的,因为我收到了SIGV(信号11)。您可以在github上看到m_pWnd声明(比在此处粘贴更好)。禁用优化并不是解决数组过度索引的问题,而是隐藏问题。过度索引会导致随机崩溃,使用优化只会增加机会。请正确修复过度索引。同意您的意见。我们在您发送修复的同时已经看到了这一点。谢谢大家。我将更新主线程。现在我只想I don’我不想知道我在你下面的帖子里写了什么:)我同意你的看法。我可以修正m_pWnd[2]的这个变化值是未知的,很可能是指向m_pScr,所以可能是在其他地方更改的,我没有对整个系统的概述,但重写内存就像俄罗斯轮盘赌。WND_WRL总是2,因为它是一个编译时常量,它的值在运行时无法更改。理解,我同意俄罗斯轮盘赌。但她缺少了一些东西e、 问题是,如果条件匹配,为什么继续迭代(2我只看到一种解释:循环变量
i
被覆盖,很难说是怎么/为什么的。关闭优化隐藏了这个问题,因为
m_pScr
被覆盖了,但是随着优化的启动,我猜
m_pWnd
数组由于某种原因在堆栈上有一个副本,在该副本之后就有了
int i
如果你想进一步调查,你可以在
i
之前添加新的局部变量(只需确保它被使用-因此没有优化),或者最好检查编译代码的反汇编。或者你可以添加如下内容:
printf(&m_pWnd[i]=%p,&m_pScr=%p,&i=%p,i=%d\n“,&m_pWnd[i],&m_pScr,&i,i);
到您的for循环。我尝试使用叮当声,但优化的代码不会覆盖
i
。。。
GtkWidget *m_pWnd[WND_WRL];
m_pWnd[i] = gtk_window_new(GTK_WINDOW_POPUP);