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

时间:2012-10-19 11:30:52

标签: c runtime-error

我在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')不会导致运行时错误。从目前为止收到的答案中我可以理解,这属于“未定义的行为”。

1 个答案:

答案 0 :(得分:4)

可能是因为代码中的某些错误会导致未定义的行为。然后让代码在printf()出现时“工作”就可以了。

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