【问题标题】:how to dynamically allocate fixed char arrays if the size isn’t known at compile time?如果在编译时不知道大小,如何动态分配固定的 char 数组?
【发布时间】:2017-02-28 11:15:05
【问题描述】:

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

如果在编译时不知道大小,可以。” 如果在编译时不知道大小,如何动态分配固定字符数组?我尝试了两个示例。我不知道不知道对不对。

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

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

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数组上动态分配?

【问题讨论】:

  • char *ch=new char; 只分配一个charstd::cin&gt;&gt;ch[i]; 跳过空格。您可以使用noskipws 将其关闭。
  • 这就是std::vector 的用途。
  • 你不是空终止ch
  • 酌情使用 std::vector 或 std::string。 C++ 标准中没有提到“固定数组”,所以如果要使用这个术语,请先定义它。固定数组与非固定数组有何不同?
  • 在第二个示例中,您在使用new 分配的对象上使用delete[]。这是一个严重的错误;将newdeletenew[]delete[] 配对。

标签: c++


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您的第一个示例是正确的,第二个示例仅为单个 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();
    

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 2018-03-05
      • 2015-01-15
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 2016-07-11
      相关资源
      最近更新 更多