为什么返回struct属性的C函数在第一次循环迭代后返回0?

为什么返回struct属性的C函数在第一次循环迭代后返回0?,c,function,for-loop,struct,C,Function,For Loop,Struct,所以我很了解C,所以如果这是一个明显的问题,请原谅我。我不明白为什么在selectedNode函数中,第一次返回的值是正确的,而其他所有值都是0。它由length属性从结构内部访问。这是我的密码 #include <stdio.h> #include <stdlib.h> typedef struct { int x; int y; } VECTOR; typedef struct { VECTOR nodes[8]; int length; } NODE_LIST;

所以我很了解C,所以如果这是一个明显的问题,请原谅我。我不明白为什么在
selectedNode
函数中,第一次返回的值是正确的,而其他所有值都是0。它由length属性从结构内部访问。这是我的密码

#include <stdio.h>
#include <stdlib.h>

typedef struct { int x; int y; } VECTOR;
typedef struct { VECTOR nodes[8]; int length; } NODE_LIST;

VECTOR Deltas[8] = {{-2, 1}, {-2,-1}, {-1,-2}, { 1,-2},
                    { 2,-1}, { 2, 1}, { 1, 2}, {-1, 2}};

NODE_LIST NodeSuccessors(VECTOR node)
{
    NODE_LIST successors;
    int count = 0;
    for (int i; i < 8; i++)
    {
        VECTOR N = {node.x + Deltas[i].x, node.y + Deltas[i].y};
        if ((N.x <  8) && (N.y <  8) && (N.x >= 0) && (N.y >= 0))
        {
            successors.nodes[count] = N;
            count++;
        }
    }
    successors.length = count;
    return successors;
}

int SelectedNode(NODE_LIST nodelist)
{
    int bestNode = 8; // the most a node could have.
    int len = 0;
    for (int n = 0; n < nodelist.length; n++)
    {
        len = NodeSuccessors(nodelist.nodes[n]).length;
        printf("%d, ", len);
        if (len < bestNode)
        {
            bestNode = len;
        }
    }
    return bestNode;
}

int main()
{
    VECTOR node = {4,4};
    NODE_LIST nNodes = NodeSuccessors(node);

    int best = SelectedNode(nNodes);
    printf("\nresult: %d\n", best);
}

干杯。

在for循环中,您有一个未初始化的值
i
。未初始化的值包含垃圾

 for (int i = 0; i < 8; i++)

在for循环中,有一个未初始化的值
i
。未初始化的值包含垃圾

 for (int i = 0; i < 8; i++)

for(int i;i<8;i++)
-->
for(int i=0;i<8;i++)
提高了编译器的警告级别,它应该发出一个关于使用未初始化变量的警告。啊,干杯,是的,这样做了。好像这并不是一个警告。@blastfurne:奇怪的是,我在Windows上使用mingw4.9.2或CentOS Linux上使用GCC4.8.5时,都没有收到关于OP代码的警告。我用了-墙和-Wextra。。。。进行调试构建。我确实得到了一个发布版本的警告。奇怪。这
for(int i;i<8;i++)
-->for(int i=0;i<8;i++)打开编译器警告级别,它应该发出一个关于使用未初始化变量的警告。啊哈,干杯,是的。好像这并不是一个警告。@blastfurne:奇怪的是,我在Windows上使用mingw4.9.2或CentOS Linux上使用GCC4.8.5时,都没有收到关于OP代码的警告。我用了-墙和-Wextra。。。。进行调试构建。我确实得到了一个发布版本的警告。奇怪的
for (int i; i < 8; i++)
         ^