我在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”)。为什么呢?
环境是:
==更新
我跟踪了我的错误。我不会发布确切的代码,因为它太长了,但是这是一个创建一个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')不会导致运行时错误。从目前为止收到的答案中我可以理解,这属于“未定义的行为”。
答案 0 :(得分:4)
可能是因为代码中的某些错误会导致未定义的行为。然后让代码在printf()
出现时“工作”就可以了。
向后计数的索引逻辑看起来很可怕;验证它是否正确。在使用之前打印索引,与pathNodes
数组的已知大小进行比较(如果有)。注意指数转为负数或超出pathNodes
的容量。