c++ - 声明没有大小的 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上,当我只制作链接和网页类时,我就开始工作了。
解决方案
作为评论说明,这是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
或其他适合您需要的容器。
推荐阅读
- javascript - 粒子 JS 的问题
- python - boto3 s3 api 在调用 GetBucketPolicyStatus 操作时失败并显示“(NoSuchBucketPolicy)”
- c# - 新插入的记录是否可用于同一事务中的后续 SQL 命令?
- autodesk-forge - 文件夹权限批量更新端点返回“访问被拒绝”错误
- c - 尝试扫描并打印结构中的字符串
- java - Swagger-Core 的对立面?
- spring-boot - 为什么我的 Spring Boot 单元测试不会在服务类中加载 @Value 属性?
- python - Python - 带有 STDIN 和 STDOUT 的子进程
- pine-script - 如何使用 Pine 脚本在监视列表中选择符号
- mongodb - 聚合管道中的可选中断