首页 > 解决方案 > 声明没有大小的 c++ 数组

问题描述

如果我在 Visual Studio 代码或其他在线编译器上声明一个数组而没有提及它的大小,那么它可以正常工作,但如果我在 Visual Studio 中使用相同的代码,那么它就不起作用。我知道声明未知大小的数组是不正确的,但只是由于不使用指针或任何其他东西的条件,我不得不使用它。在visual studio上,当我只制作链接和网页类时,我就开始工作了。

谁能告诉我如何做到这一点。

#include <iostream>
using namespace std;
class link
{
    const char* name;
public:
    link() :name("null")
    {
        cout<<"Default link constructor called"<<endl;
    };
    link(const char n[]) :name(n)
    {
        cout<< "Parameterized link constructor called"<<endl;
    };
};
class webpage
{
private:
    double height;
    double width;
    int linkno;
    link links[];
public:
    webpage() :height(10), width(10), linkno(2)
    {
        links[0]=NULL;
        links[1]=NULL;
    };
    webpage(double hw,int lno, link hyperlinks[]) :height(hw), width(hw),linkno(lno)
    {
        for (int i = 0; i < linkno; i++)
        {
            links[i]=hyperlinks[i];
        }
    };
    webpage(double h, double w,int lno, link hyperlinks[]) :height(h), width(w),linkno(lno)
    {
         for (int i = 0; i < linkno; i++)
        {
            links[i]=hyperlinks[i];
        }
    };
    void showdata(int linkno)
    {
        cout << "height: " << height << endl;
        cout << "width: " << width << endl;
        cout << "links " << endl;
        for (int i = 0; i < linkno; i++)
        {
            cout << "link #" << i + 1 << " = " << links[i].getname() << endl;
        }
    }
};
class website
{
private:
    const char* name;
    int webpageno;
    webpage wpgs[];
public:
    website() :name("null"),webpageno(4)
    {
        wpgs[0];
        wpgs[1];
        wpgs[2];
        wpgs[3];
    };
    website(const char n[],int wpn, webpage page[]) :name(n),webpageno(wpn)
    {
        for (int i = 0; i < webpageno; i++)
        {
            wpgs[i]=page[i];
        }
        
        cout<<"Parameterized website constructor called"<<endl;
    };
    void showdata(int linkno, int pageno)
    {
        cout << endl<< "Website name: " << name << endl;
        for (int j = 0; j < pageno; j++)
        {
            cout << "Webpage #" << j + 1 << " : " << endl;
            wpgs[j].showdata(linkno);
            cout<<endl<<endl;
        }
    }
};
int main(int argc, char* argv[])
{
  link link1[2]={"maha","saira"};
  webpage page[1]={{32,21,2,link1}};
    website site("my website",1,page);
    site.showdata(2,1);
}

在visual studio上,当我只制作链接和网页类时,我就开始工作了。

标签: c++arrays

解决方案


作为评论说明,这是https://en.wikipedia.org/wiki/Flexible_array_member

Windows API 在一些地方使用了这种技术。因此,Visual Studio 使用 C++ 支持这一点,如https://docs.microsoft.com/en-us/cpp/cpp/arrays-cpp?view=vs-2019中所述

仅当数组是结构或联合中的最后一个字段并且启用了 Microsoft 扩展 (/Ze) 时,零大小的数组才是合法的。

然而,使用这种技术的诀窍是,创建对象的人还必须在它之后分配内存,以便扩展非大小数组。否则,使用该数组会导致用于其他目的的内存损坏。

因此,以您的方式使用它是不正确的。您的程序没有表现出奇怪的行为或崩溃只是偶然的。

作为评论说明,您应该使用std::vector或其他适合您需要的容器。


推荐阅读