我有这些代码:
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 ++不能解释为什么不停止。
答案 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);