如果在编译时不知道大小,如何动态分配固定的char数组?

时间:2017-02-28 11:15:06

标签: c++

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

如果在编译时不知道大小,请注意。“如果在编译时不知道n的大小,如何动态分配固定的char数组?我试过两个例子。我不知道不知道是否正确。

#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 
  }

它打印没有空格的字符串。我不能在这里打印空格。这并不显示白人。

2)

int main() {    
    char *ch=new char;
    std::cout<<"enter a string\n";    
    std::cin.getline(ch,255);    
    std::cout<<ch<<'\n'; 
    delete[]ch; 
    ch=nullptr;//c++11 is accepted ## Heading ##  
    std::cout<<" after null pointer:"<<ch; 
 }

如果在编译时不知道大小,那么它被认为是在固定char数组上动态分配的?或者它们都不正确?

2 个答案:

答案 0 :(得分:1)

第一个是关于&#34; C ++&#34;中的动态数组分配是正确的。它看起来有点奇怪,但它会做。

只是为了提出一个有效的观点:

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

答案 1 :(得分:1)

你的第一个例子是正确的,第二个例子只为一个你不想要的char分配内存。

但是,如果你想要一个没有已知编译时间长度的动态数组,那么你应该使用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();