【问题标题】:Why C function returning struct attribute returns 0 after first loop iteration?为什么 C 函数返回结构属性在第一次循环迭代后返回 0?
【发布时间】:2017-12-16 02:38:44
【问题描述】:

所以我对 C 非常了解,所以如果这是一个明显的问题,请原谅我。我无法弄清楚为什么在 selectedNode 函数中第一次返回正确的值,但对于所有其他函数返回 0。它是通过长度属性从结构内部访问的。这是我的代码。

#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);
}

当前结果输出为:

8, 0, 0, 0, 0, 0, 0, 0, result: 0

干杯。

【问题讨论】:

  • 这个for (int i; i &lt; 8; i++) --> for (int i = 0; i &lt; 8; i++)
  • 调高你的编译器警告级别,它应该发出关于使用未初始化变量的警告。
  • 啊,干杯,是的。好像这不是警告一样。
  • @Blastfurnace:奇怪的是,在使用 MinGW 4.9.2 的 Windows 或使用 gcc 4.8.5 的 CentOS Linux 上,我没有收到关于 OP 代码的警告。我使用了 -Wall 和 -Wextra。
  • ... 进行调试构建。我确实收到了构建发布版本的警告。很奇怪。

标签: c function for-loop struct


【解决方案1】:

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

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

如果您为您的编译器打开了编译器选项,它会警告您。以gcc -Wall -Werror 为例

错误:变量“i”在此处使用时未初始化 [-Werror,-Wuninitialized]

for (int i; i < 8; i++)
         ^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2016-08-27
    • 2022-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多