繁体   English   中英

为什么添加printf(“ A”)会使我的代码运行,而删除它会使它崩溃

[英]why does adding a printf(“A”) make my code run, and removing it makes it crash

我在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”)。 为什么?

环境是:

  • Windows 7 32位
  • MinGW32 20120426(并且我已经添加了MSys 1.0)
  • Eclipse Juno for 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;
}

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

可能是因为代码中的某些错误导致未定义的行为。 然后在出现printf()的情况下让代码看起来“起作用”就可以了。

向后计数的索引逻辑看起来很可怕。 验证它是正确的。 如果使用索引,请在使用索引之前将其打印出来,并与pathNodes数组的已知大小进行比较。 当心索引pathNodes负数或pathNodes的容量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM