【问题标题】:Allocate extra memory to the character array C++为字符数组 C++ 分配额外的内存
【发布时间】:2013-03-25 16:34:31
【问题描述】:

我有这个问题,我有一个字符串,我将它作为字符指针传递给函数。

 void test(char * str) {
    ....
 }

其中 str = "abc"。现在我想在这个字符串的末尾添加一些额外的字符而不创建新字符串。我不想使用 strcat,因为我不知道要在字符串末尾添加多少个字符以及要添加什么。我试图使用 realloc 但它不起作用,因为 str 是在堆栈上分配的。

有什么方法可以动态增加 char 数组的大小?

更新: 在我的采访中,有人问了我一个与此有关的问题。我被要求在不使用额外空间的情况下这样做。因此,如果我使用 malloc 分配内存,我在技术上会使用额外的空间,对吗?

谢谢

【问题讨论】:

  • void test(char ** str){…; *str = realloc(...); assert(*str);}
  • @Eddy_Em 像这样使用 realloc 是危险的。始终先使用临时变量,然后再将其复制进去。此外,如果传入由 alloca 创建的指针或字符数组,会发生什么情况,就像 OP 似乎要求的那样?
  • @Eddy_Em 不,您使用临时变量来确保 realloc 在重新分配参数中传递的引用之前成功。
  • @Fox,如果你想要 C++ 的解决方案,你应该使用 std::string 容器而不是字符数组。
  • 所以,面试官问你“附加到堆栈上分配的字符串,给定 that 函数签名?”要么他们只是想拒绝你,要么他们希望你告诉他们他们疯了。即使您使用额外的内存,该函数原型也永远无法工作。

标签: c++ string pointers string-concatenation


【解决方案1】:

不,特别是如果字符串是在堆栈上分配的。堆栈空间在编译时是固定的。您必须先分配更多空间,或者分配一个具有更多空间的新数组并strcpy 结束。

【讨论】:

  • 无需多义。您的答案同样适用于 C 和 C++。
  • @duskwuff 啊,我不知道。谢谢。
【解决方案2】:

如果您使用的是 C++ - 那就坚持使用 std::string 并忘记与 char * 的全部交易。

但是,如果您希望将char * 用于字符串,则分配一个新的字符数组和strcpy() 从一个字符串到另一个字符串。不要忘记释放原来的char *内存以避免内存泄漏。

在我的采访中,有人问了我一个与此相关的问题。我被要求在不使用额外空间的情况下这样做。因此,如果我使用 malloc 分配内存,我在技术上会使用额外的空间,对吗?

如何在不增加额外空间的情况下增加字符串的长度?

【讨论】:

  • 如果我使用你的 char* 建议,它仍然被认为是算法中的常量空间吗?
  • Ex -- careercup.com/question?id=16018673 要求的空间复杂度为 O(1)。但是你需要创建一个新的字符串..
  • @Fox 啊不 - 这不是它的意思。这意味着您不能创建新字符串 - 您必须修改相同的字符串。这意味着您必须首先为字符串分配足够的内存,但不能创建额外的字符串。
  • @Fox 将其视为“在不使用第三个变量的情况下交换两个整数变量的内容”
  • 如果您不知道需要多少空间,您将如何分配足够的内存?
【解决方案3】:

您必须delete 旧字符串并分配一个带有new 的新字符串,并具有您想要的长度。

【讨论】:

  • 我不知道为什么这被如此严厉地否决,但如果我们在这里谈论 C++,它正确的。不幸的是,OP 似乎没有使用 C++,他只是错误地标记了他的问题。
  • @RichardJ.RossIII,我没有投反对票,但我完全理解。除了字符串不是newed等其他问题之外,这个解决方案的根本问题是strchar *类型的参数,如果你删除它,使用当前函数原型,你无法让用户知道镇上有另一个指针。
【解决方案4】:

对不起,没有。无法调整动态变量/数组的大小。问题是另一个变量,甚至另一个调用框架可能紧跟在相关变量之后。这些不能移动以腾出空间,因为在代码的其他地方可能存在指向这些对象的指针。

【讨论】:

  • 也许您的意思是 static 数组无法调整大小?因为realloc 完全按照你说的做,即调整动态数组的大小。
【解决方案5】:
void test(string  &str) {
    ....
    str += "wibble";
 }

似乎适用于 C++

【讨论】:

    【解决方案6】:

    您可以在输入字符串之后的字节中存储新值,而不是使用 realloc(不在堆栈上完成)或 strcpy(使用额外的缓冲区空间)。在下面的简单示例中,我以“abcd”开头,并在函数 fn 的末尾添加三个 z。

    void fn(char *str)
    {
        int len = strlen(str);
        memset(str+len, 'z', 3);
        str[len+3] = 0;
        return;
    }
    
    int main()
    {   
        char s[] = "abcd";
        printf("%s\n", s);
        fn(s);
        printf("%s\n", s);  
    }
    

    输出:

    abcd
    zzz
    

    这种方式可以扩展为在原始字符串前面添加不同的字符串。

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2022-01-01
      相关资源
      最近更新 更多