【问题标题】:char** memory allocation using new operatorchar** 使用 new 运算符分配内存
【发布时间】:2012-11-29 10:05:56
【问题描述】:

我真的对这个抛出错误感到困惑......

    char** results = new char*[numRes];  //this is where it breaks
    for(int i = 0; i < numRes; i++)  
    {  
         results[i] = new char[64];  
    }  

它引发了堆损坏错误。但它肯定应该工作吗?我将 4 char* 分配给字符指针列表,以便我可以将它们传递给函数等。

我到处看了看,但它们似乎都在显示 malloc 和 free...我在课堂上使用它们,所以我想坚持使用 c++ new 和 delete。

有人可以帮帮我吗?

【问题讨论】:

  • 你是如何完成这项任务的? results[0]=&amp;char1; 或完全不同的东西?
  • for (int i = 0; i
  • 你会在要写入字符串的地方添加一个 sn-p 代码吗?
  • 这只是 main() 中的一个简单的内存分配......如果我什至不能让它首先创建点数组,那我该怎么做并不重要?但我打算使用 strcpy(results[n],somestring)
  • @Programmer 我在 2012 年写了这篇文章,当时我还是一个编程新手。我最初共享的代码中没有任何内容对我来说是错误的。我假设这里发生的事情是我在程序中早些时候破坏了内存,当它在这里分配内存时它会崩溃。我会倾向于这种情况,尤其是我说它崩溃的那条线。

标签: c++ memory pointers char allocation


【解决方案1】:

分配后你在做什么?您只分配了一个字符指针数组,没有为每个元素(指针)分配空间。如果您尝试在元素中存储项目,则会遇到问题。

例如,如果您想在分配后将任何内容存储在 results[0] 中,您也需要分配给它。例如:

results[0] = new char[100]; // NEED TO ALLOCATE BEFORE WRITING TO results[0]!
strcpy(results[0], "Test");

您不能只复制到 results[0] 而不进行分配。这同样适用于结果的任何元素。

【讨论】:

  • 我将 char 点数组传递给一个方法(我正在创建一个 Lua 类),我只是将 char 指针数组传递给该方法 - void LUA::getResults(char** data) //获取字符串 { for(int i = 0; i
  • 但他说,他将字符指针分配给结果数组。
  • 然后我们需要查看代码以确保它发生。对于 OP,请使用显示此内容的代码 sn-p 更新您的帖子。
  • 因此,使用您刚刚在评论中添加的代码 sn-p,这个答案是正确的:首先,您需要在执行 strcpy(data[i],readString());之前分配指针数组指向的东西>
【解决方案2】:

您正在为指针数组分配内存。之后,您必须为数组中的每个指针分配内存。我认为你的代码应该是这样的:

    int numRes = 4;
    char** results = new char*[numRes];

    for(int i=0; i<numRes; i++)
    {
         results[i] = new char;
    }

【讨论】:

  • 不能因为程序在“char** results = new char*[numRes];”这一行中断顺便说一句 - 我是这个论坛的新手,所以我不知道如何发布格式良好的回复:(
  • 如果它真的在那个分配中中断,那么你的堆已经损坏了,你需要搜索之前发生的事情。不过,您的代码中还有另一个错误,该错误已被其他答案所涵盖:-)
【解决方案3】:

如果使用 c++,是否可以使用 STL?特别是代码中的 std::string 和 std::list 或 std::vector 类?与传统的 C 字符串不同,C 字符串对象只是内存数组中的字符序列,C++ 字符串对象属于一个类,它具有许多内置功能,可以以更直观的方式对字符串进行操作,并且具有 C++ 容器常见的一些附加有用功能。

#include <string>
#include <list>

std::list<std::string> results; // create a list of strings

// and populate it
results.push_back("blah");
results.push_back("blah1");
results.push_back("blah2");
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多