为字符数组C ++分配额外的内存

时间:2013-03-25 16:34:32

标签: c++ string pointers string-concatenation

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

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

其中str =“abc”。现在我想在此字符串的末尾添加一些额外的字符,而不创建新的字符串。我不想使用strcat,因为我不知道我添加到字符串末尾有多少字符以及我要添加的内容。我试图使用realloc,但它不能正常工作,因为str是在堆栈上分配的。

有没有办法可以动态增加char数组的大小?

更新: 在我的采访中,我被问到一个涉及此问题的问题。我被要求在不使用额外空间的情况下这样做。所以,如果我使用malloc分配内存,我在技术上会使用额外的空间吗?

由于

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果你正在使用C ++ - 那么坚持std::string并忘记与char *的整个交易。

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

  

在我的采访中,我被问到一个涉及此问题的问题。我被要求在不使用额外空间的情况下这样做。所以,如果我使用malloc分配内存,我在技术上会使用额外的空间吗?

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

答案 4 :(得分:0)

void test(string  &str) {
    ....
    str += "wibble";
 }

似乎适用于C ++

答案 5 :(得分:0)

您可以在输入字符串后面的字节中存储新值,而不是使用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

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