C++ 如果大小为’;编译时不知道吗?

C++ 如果大小为’;编译时不知道吗?,c++,C++,如果在编译时不知道大小,是否认为这是在固定字符数组上的动态分配?我的老师说:“在C++中,你不能分配一个可变长度的固定数组。你必须动态地分配固定的ARR。 2.清单项目 如果大小在编译时未知,则为“n”。如果大小在编译时未知,如何动态分配固定字符数组?我尝试了两个示例。我不知道这是否正确 #include<iostream> int main() { std::cout<<"enter the length of string\n";

如果在编译时不知道大小,是否认为这是在固定字符数组上的动态分配?我的老师说:“在C++中,你不能分配一个可变长度的固定数组。你必须动态地分配固定的ARR。 2.清单项目

如果大小在编译时未知,则为“n”。如果大小在编译时未知,如何动态分配固定字符数组?我尝试了两个示例。我不知道这是否正确

#include<iostream>

int main() {    
     std::cout<<"enter the length of string\n";    
     int length; 
     std::cin>>length; 
     char *ch=new char[length];     
     for(int i=0;i<length;i++)     
       std::cin>>ch[i];
     std::cout<<ch;
     delete[]ch;    
     ch=nullptr;//c++11 is accepted 
  }
#包括
int main(){
标准:coutlength;
char*ch=新字符[长度];
对于(int i=0;i>ch[i];

std::cout第一个关于“C++中的动态数组分配”是正确的。它看起来有点奇怪,但可以

我想提出一个有效的观点:

  • 声明为
    char*
    是正确的
  • 通过
    new char[size];
    进行分配也是正确的。因为这会使您的数组在运行时固定大小。(除非您删除并使用不同的大小重新创建它)

您的第一个示例是正确的,第二个示例只为单个
字符分配内存,而您不需要这些字符

但是,如果您想要一个没有已知编译时长度的动态数组,那么您应该使用
std::vector
,以简化您的工作,并减少代码出错的可能性:

std::cout<<"enter the length of string\n";    
int length; 
std::cin>>length; 
std::vector<char> ch(length);     
for(int i=0;i<length;i++)     
  std::cin>>ch[i];
ch.push_back('\0');
std::cout<<ch.data();
std::coutlength;
std::向量ch(长度);
对于(int i=0;i>ch[i];
ch.push_back('\0');

std::cout
char*ch=new char;
只分配一个
char
std::cin>>ch[i];
跳过空格。您可以使用
noskipws
关闭它。这就是
std::vector
的用途。您不能以空值终止
ch
。请适当使用std::vector或std::string。没有提到在C++标准中,“固定数组”,所以如果你想使用这个术语,首先定义一个固定数组,它是如何与一个非固定数组不同的?在第二个示例中,在一个分配给<代码>新< /COD>的对象上使用<代码> Dele[]/Cuth.To是一个严重的错误;配对<代码>新< /代码>用<代码>删除< /COD>和<代码> NeX[]/Cord> > <代码> >删除[]
std::cout<<"enter the length of string\n";    
int length; 
std::cin>>length; 
std::vector<char> ch(length);     
for(int i=0;i<length;i++)     
  std::cin>>ch[i];
ch.push_back('\0');
std::cout<<ch.data();