【问题标题】:dynamic memory allocation of strings in cppcpp中字符串的动态内存分配
【发布时间】:2015-11-05 15:53:19
【问题描述】:

所以这是我已经在代码上工作了 5 个小时的事情,逻辑看起来不错,程序似乎可以完成它的工作,唯一一直困扰我的是字符串的动态内存分配。该问题未指定用户必须输入的初始字符串数。这是我一直在尝试动态获取字符串的方法:

      int t;
      cin>>t  //number of strings user wishes enter 
      char *s1[1000009];  //1000009 is the maximum number of digits each string can have
      for(i=0;i<t;i++)
      {
                s1[i]=(char *)malloc(1000009) 
                cin>>s1[i];
      }

不确定这是否正确。如果不是动态字符串,我也可以存储二维字符数组。

谢谢你, 高拉夫

【问题讨论】:

  • 我认为你应该使用std::vectorstd::string
  • 不要使用malloc进行手动动态分配。请改用new。根本不要使用手动动态分配。请改用std::string
  • 在堆栈上创建包含 1000009 个元素的数组是个坏主意。

标签: c++


【解决方案1】:

使用字符串向量而不是使用 malloc/new。

int t;
std::cin >> t;
std::vector<std::string> strings(t); //Create t strings
for(int i = 0; i < t; i++)
    std::cin >> strings[i]; //Read into each string

【讨论】:

  • 先生,工作就像一个魅力谢谢你,很明显我在向量方面有很多东西要学!
  • 很明显它第一次起作用了,现在它只是描述了运行时错误,它说:在抛出'std::bad_alloc'what()的实例后调用终止:std::bad_alloc
  • 确保 t 有效。 std::vector 采用无符号值作为大小,因此如果 t 为负数,则无符号值将非常大。
  • 很确定 t 永远不会是负数:3
【解决方案2】:

既然您将此问题标记为 C++,我会这样做:

std::vector<std::string> s1(1000009);

仅此而已 - 无需使用 malloc,无需担心破坏。 如果您使用 C++,请使用可用的工具。

【讨论】:

    【解决方案3】:

    我会这样做:

    int i = 0;
    char **s1;
    s1 = (char **)malloc(t * sizeof(char *));
    while (i < t)
    {
     s1[i] = (char *)malloc(1000009 * sizeof(char));
     i++;
    }
    

    第一个 malloc 创建你的 t 行。 第二个为每行填充分配 100000009 个字符

    【讨论】:

    • 但如上所述,std::string 的向量会更高效。
    • 正如他所说的那样无法编译,而且我仍然不知道向量如何使用 malloc 或 new 以任何方式工作会很棒
    • std::string 测试; std::vector<:string> vec;整数吨;诠释 i = 0;标准::cin >> t; while(i > 测试;我++; vec.push_back(测试); test.clear(); }
    • @ThomasGrockowiak 是的,可以很好地使用向量谢谢!
    • 很抱歉再次打扰您,代码似乎运行良好但这里需要很多时间看看,link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2020-11-28
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多