C ++:使用枚举类型

时间:2016-04-26 14:03:03

标签: 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);
   assert(m_pWnd[i]);
}

第一个只是解释我的问题。第二个是我的问题。

第二个代码的来源可以在这里找到: https://github.com/HuayraLinux/intel-classmate-function-keys/blob/master/OnScrDsp.cpp

问题:

WND_WRL变量来自

typedef enum {
    WND_BRG,
    WND_DSP,
    WND_WRL,
} WND_ID;

结构。

在第一个代码中我可以看到i迭代直到2(0,1,2)并且WND_WRL将始终为2.问题在于第二个代码:甚至WND_WRL也会打印2个值,这将迭代i直到接收到SIGV信号(11)并打破我的申请(这里以i = 384停止)。我能理解为什么384,我并不关心。

我不明白为什么同样的条件提供了不同的方法。如果我将WND_WRL更改为2,我会得到正确的代码并正确执行应用程序。

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

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

解决方案:

更改表达式&#34; i&lt; = WND_WRL&#34;到&#34; i&lt; WND_WRL&#34;因为m_pWnd大小。它解释了SIGV,但没有解释为什么继续直到接收SIGV,即使2&lt; = 2条件匹配。我们知道的覆盖内存可以破坏很多东西,但常量和代码是只读堆栈内存区域,因此访问m_pWnd [3]和其他i ++不能解释为什么不停止。

1 个答案:

答案 0 :(得分:3)

变量m_pWnd在源代码中定义为指针数组,大小为2,因此有效索引为0或1。

GtkWidget *m_pWnd[WND_WRL];

但是你的循环转为i <= WND_WRL,因此i=2案例会崩溃

m_pWnd[i] = gtk_window_new(GTK_WINDOW_POPUP);