Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在某些条件下非常奇怪的代码,包括优化_C++_C_Gcc_Optimization - Fatal编程技术网

C++ 在某些条件下非常奇怪的代码,包括优化

C++ 在某些条件下非常奇怪的代码,包括优化,c++,c,gcc,optimization,C++,C,Gcc,Optimization,我有一段代码: #include <stdio.h> void optimization_headache() { int t = 11; int l[1047] = {0}; int u_lu[23] = {0}; int u = 0; l[0] = 0; l[1] = 0; do { u++; /

我有一段代码:

#include <stdio.h>     

void optimization_headache()    
{    
    int t = 11;    
    int l[1047] = {0};    
    int u_lu[23] = {0};    

    int u = 0;    

    l[0] = 0;    
    l[1] = 0;    

    do {    
        u++;    
        //printf("Incrementing u, now u is %d\n", u);     
        u_lu[u + 1] = u - l[u + 1];    
    } while ((u < t * 2) && (l[u + 1] <= t));    

    printf("u = %d, l[u] = %d, t = %d, u_lu[u] = %d\n", u, l[u], t, u_lu[u]);    
}    

int main()    
{    
    optimization_headache();    

    return 0;    
}
#包括
void优化
{    
int t=11;
int l[1047]={0};
int u_lu[23]={0};
int u=0;
l[0]=0;
l[1]=0;
做{
u++;
//printf(“增加u,现在u是%d\n”,u);
u_lu[u+1]=u-l[u+1];

}而((u 在您的情况下,这是相关部分:

int t = 11;    
int u_lu[23] = {0};    

do {    
    u++;    
    u_lu[u + 1] = u - l[u + 1];    
} while ((u < t * 2) /*...*/);    
int t=11;
int u_lu[23]={0};
做{
u++;
u_lu[u+1]=u-l[u+1];
}而((u

循环在
u
小于22时运行,因此它可以变为21。但是在循环内部,您将
u
增加两次,然后写入
u\lu[23]
。这比分配的多了一个。

这种行为会随着
-fno积极的循环优化而消失,这意味着您可能有未定义的行为。有关gcc正在执行的操作的详细说明,请参阅。最有可能发生越界访问。您的代码可以写入
u lu[23]
。(您在
u<22
时循环,但
u
增加两次)@Wimmel噢,我的天哪。我花了这么多时间从一个巨大的纠错库中编辑了这个小示例,只是为了把它发布到这里,我没有足够的脑细胞来仔细查看代码。还有一个事实是,对某些事情进行注释,并使u变得易变,这让我陷入了一个循环。将您的注释作为答案发布,我将继续接受它。如果细微的更改影响了行为,则可能索引超出范围。通过更改没有意义的小事情,首先应该是未定义行为的危险信号:(