2

我在 C 中有以下代码:

while(tempNode!=NULL) {
    int pos = pathNodesCount-1-i;
    pathNodes[pos] = tempNode;
    //printf("A");
    euclidianLength += tempNode->g;
    i = i+1;
    tempNode = tempNode->parent;
}

如果我将该printf("A")语句注释掉,然后编译并运行我的代码,我将收到“应用程序停止运行”Windows 错误。如果我取消注释该printf("A")行,重新编译并运行,应用程序将运行到它的末尾(沿途将“A”打印到控制台)。为什么?

环境是:

  • 视窗 7 32 位
  • MinGW32 20120426(我添加了 MSys 1.0)
  • Eclipse Juno 用于 C/CPP

== 更新

我已经跟踪了我的错误。我不会发布确切的代码,因为它太长了,但它是创建一个 char 数组,然后在错误的索引处添加字符的情况。像这样的东西:

int otherCrap() {
    char* c = malloc(10*sizeof(char));
    int i = 0;
    for(i = 0; i<13; i++) {
        c[i]='a';
    }
    c[15] = '\0';
    printf("A");
    printf(c);

    return 0;
}

修复问题,使字符仅在现有索引处放置在数组中,并将 '\0' 字符添加为数组中的最后一个元素解决了该问题。但是,我仍然不清楚为什么当代码错误时,在打印 char 数组之前添加 printf('A') 不会导致运行时错误。从到目前为止收到的答案中,我了解到这属于“未定义的行为”。

4

1 回答 1

4

可能是因为代码中的某些错误导致未定义的行为。然后让代码在存在 a 的情况下看起来“工作”printf()很好。

向后计数的索引逻辑看起来很可怕;验证它是否正确。在使用它之前打印索引,与数组的已知大小进行比较pathNodes(如果有的话)。谨防指数转为负数或超出pathNodes.

于 2012-10-19T11:33:56.443 回答