调试为什么size_t不能作为数据成员工作?

Bin*_*ngo 0 c++

有人可以告诉我为什么第一个程序崩溃,但第二个程序没有崩溃?第一个(崩溃):

#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;
}
Run Code Online (Sandbox Code Playgroud)

第二个不会崩溃(使用构造函数的本地变量而不是数据成员来计算):

   #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;
    }
Run Code Online (Sandbox Code Playgroud)

在Windows上运行MinGW.make:* [run]错误-1073741819

Mic*_*urr 7

很简单,因为在你的第一个例子中构造函数n在它n被初始化之前使用(实际上,永远不会被初始化).

所以行

while(cstr[n++])
Run Code Online (Sandbox Code Playgroud)

是未定义的行为.

尝试:

   test(const char *cstr) : n(0)  // <-- initialize n
    {
        size_t j=0;
        while(cstr[n++])
            ;
        //j = n;
    }
Run Code Online (Sandbox Code Playgroud)