在两种情况下输出都不一样吗?

Sha*_*yas 0 c++ dev-c++

注意"len = strlen(s);"行中代码的差异.在代码1中:它在"strcpy(str,s)"之前写入,在代码2之后写入.它有什么不同?我在Dev C++中运行我的代码,我得到不同的输出.在两种情况下输出都不一样吗?

代码1:

#include <iostream>
#include <string.h>
using namespace std;

class String{
    private:
        char str[];
        int len;
    public:
        String()
        {
            cout << "Default Constructor" << endl;
            len = 0;
            strcpy(str,"");
        }
        String(char s[])
        {
            cout << "parameterised constructor" << endl;
            len = strlen(s);
            strcpy(str,s);
        }
        void print()
        {
            cout << str << " len = " << this->len << " strlen = " << strlen(str) << endl;
        }
};

int main()
{
    String str2("Hello World");
    str2.print();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出1:

parameterised constructor
Hello World len = 1819043144 strlen = 11
Run Code Online (Sandbox Code Playgroud)

代码2:

#include <iostream>
#include <string.h>
using namespace std;

class String{
    private:
        char str[];
        int len;
    public:
        String()
        {
            cout << "Default Constructor" << endl;
            len = 0;
            strcpy(str,"");
        }
        String(char s[])
        {
            cout << "parameterised constructor" << endl;
            strcpy(str,s);
            len = strlen(s);
        }
        void print()
        {
            cout << str << " len = " << this->len << " strlen = " << strlen(str) << endl;
        }
};

int main()
{
    String str2("Hello World");
    str2.print();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出2:

parameterised constructor
 len = 11 strlen = 1
Run Code Online (Sandbox Code Playgroud)

Jab*_*cky 5

问题出在这里:

char str[];
Run Code Online (Sandbox Code Playgroud)

这是一个零长度数组(标准C++中的BTW,你不能有零长度数组).

这个数组最多可以包含0个字符,所以在你的情况下,零长度数组是没有意义的.

您基本上覆盖了不属于您的内存,并且两个程序的行为都是未定义的.由于行为未定义,因此在两个版本中输出不同的原因也是没有意义的.

试试这个让你有100个大小的字符串:

char str[100];
Run Code Online (Sandbox Code Playgroud)

要在C++中使用字符串,您应该使用std::string原始C字符串.