有人可以告诉我为什么第一个程序崩溃,但第二个程序没有崩溃? 第一个(崩溃):
#include <cstdlib>
class test
{
public:
test(const char *cstr)
{
size_t j=0;
while(cstr[n++])
;
//n = j;
}
private:
size_t n;
};
int main()
{
test("Hello, world!\n");
return 0;
}
第二个不会崩溃(使用构造函数的本地变量而不是数据成员来计算):
#include <cstdlib>
class test
{
public:
test(const char *cstr)
{
size_t j=0;
while(cstr[j++])
;
n = j;
}
private:
size_t n;
};
int main()
{
test("Hello, world!\n");
return 0;
}
在Windows上运行MinGW。 make: * [run]错误-1073741819
答案 0 :(得分:7)
很简单,因为在你的第一个例子中,构造函数在初始化之前使用n
(实际上,n
永远不会被初始化)。
所以行
while(cstr[n++])
是未定义的行为。
尝试:
test(const char *cstr) : n(0) // <-- initialize n
{
size_t j=0;
while(cstr[n++])
;
//j = n;
}
答案 1 :(得分:3)
在第一种情况下,您使用的是未初始化的n
,这就是您的程序崩溃的原因,这是未定义行为(UB)的可能性之一。使用未初始化的变量调用UB。
test(const char *cstr)
{
size_t j=0; //<--- here you want to do : n = 0;
while(cstr[n++])
;
//j = n;
}
或者更好的是,你应该使用member-initialization-list:
test(const char *cstr) : n(0)
{ //^^^^^^ it is member-initialization-list
while(cstr[n++]) ;
}
确保cstr
是以空字符结尾的字符串,否则您的代码仍会有UB。
答案 2 :(得分:2)
第一个示例中的私有成员size_t n从未初始化。它的价值是不确定的。在你的while循环之前添加n = 0,它应该是相同的。