先前声明的变量在循环中找不到

时间:2016-11-25 18:46:31

标签: c declaration unused-variables

我正在研究sha1 cracker作为大学项目的实施。 我正在尝试使用循环获取其哈希值的不同值。

for(int a=0; a<26; a++)
{
    for(int b=0; b<26; b++)
    {
        for(int c=0; c<26; c++)
        {
            for(int d=0; d<26; d++)
            {
                for(int e=0; e<26; e++)
                {

                    for(int f=0; f<26; f++)
                    {
                        result[0]=alphabet[a];
                        result[1]=alphabet[b];
                        result[2]=alphabet[c];
                        result[3]=alphabet[d];
                        result[4]=alphabet[e];
                        result[5]=alphabet[f];


                        //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);

                        // Declarations
                        uint32_t a,b,c,d,e,temp;
                        uint32_t w[80]= {0};
                        a=h0;
                        b=h1;
                        c=h2;
                        d=h3;
                        e=h4;

下面的代码只是正在进行的SHA-1代码。 外部的循环用于测试每个选项的6个字符的单词。

如果我现在尝试在第一个for循环之前移动uint32_t声明行(但仍然在同一个函数中,C编译器警告我变量未使用,程序崩溃,因为这些变量似乎丢失了在循环中。但出于性能原因,我不想每次都声明它们。 如果我尝试全局声明它们,则会出现同样的问题。但是当它们在最后一个循环中声明时,一切正常

2 个答案:

答案 0 :(得分:0)

您要将变量声明两次。每个Stretch声明变量。您应该能够将for(int x移出循环,并在第一个uint32_t a,b,c ...之前移动。您需要从每个for语句中删除for

这应该编译(我不知道代码是否会起作用或者做你想做的事情,因为你似乎正在重置最内层循环中的循环变量):

int

或者正如您在评论中所说,您需要将变量重命名为不重新定义循环变量,如下所示:

uint32_t a,b,c,d,e,temp;
uint32_t w[80]= {0};

for(a=0; a<26; a++)
{
    for(b=0; b<26; b++)
    {
        for(c=0; c<26; c++)
        {
            for(d=0; d<26; d++)
            {
                for(e=0; e<26; e++)
                {

                    for(f=0; f<26; f++)
                    {
                        result[0]=alphabet[a];
                        result[1]=alphabet[b];
                        result[2]=alphabet[c];
                        result[3]=alphabet[d];
                        result[4]=alphabet[e];
                        result[5]=alphabet[f];


                        //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);

                        // Declarations
                        a=h0;
                        b=h1;
                        c=h2;
                        d=h3;
                        e=h4;

答案 1 :(得分:0)

  

如果我现在尝试在第一个for循环之前移动uint32_t Declaration行(但仍然在同一个函数中,C编译器警告我变量未使用,程序崩溃,因为这些变量似乎在循环中丢失。

如果你把uint32_t a; uint32_t b; ... uint32_t e;在外面,然后重新声明为int a; int b; ... int e; ,声明为uint32_t类型的变量超出范围。在最内部的for循环中,变量a,b,...,e是在for语句中声明的变量。在所有for循环之后,int a,...,e超出范围,并且将使用uint32_t变量。但它们没有分配到所需的值。

如果你把uint32_t声明放在内部for循环中,那么uint32_t就在范围内,那些int超出了范围(或者我应该说它们是&#34;被覆盖&#34 ;?)。

  

但出于性能原因,我不想每次都宣布它们。

如果你真的想保留像现在这样的嵌套循环,让编译器优化它。每次执行内部循环时都不会重新声明变量。您可以比较结果汇编代码。否则,请考虑@JonathanLeffler的建议,将它们分成函数以使代码更具可读性。

如果我犯了任何错误,请不要犹豫,指出它们/它们!谢谢!