【发布时间】:2013-10-22 07:11:07
【问题描述】:
给定以下代码:
#include<iostream>
int main(){
char container[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
for(char* cptr = container; *cptr != 0; cptr++)
std::cout << *cptr << std::endl;
return 0;
}
每次执行时它都会按顺序打印这些字符。我不明白为什么循环会终止,因为我没有在容器数组的末尾明确指定任何空终止符。请帮忙。
【问题讨论】:
-
应该会导致分段错误
-
根据环境的不同,你的容器之后的内存可能会被初始化为零,从而导致空终止符恰好在那里。但是,这并不能保证,因此它可能会在不同的机器/不同的编译器设置/不同的东西上失败。
-
未定义的行为,你可以预测代码在运行时的行为。
-
@VladLazarenko 有动态分析工具,如 valgrind 和电围栏,旨在发现这类问题。此外,堆分配器的调试版本通常将模式写入内存,以发现引用堆的问题。在这种情况下,它是堆栈内存,因此您可能需要其他东西。
-
这就是为什么它被称为未定义的行为。它可以格式化你的硬盘,点亮白宫的圣诞树,或者工作……
标签: c++ arrays loops pointers char