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

Allocate extra memory to the character array C++

本文关键字:内存 分配 c++ 字符 数组      更新时间:2023-10-16

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

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

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

是否有任何方法可以动态地增加字符数组的大小?

更新:在我的面试中,有人问了我一个与此有关的问题。我被要求在不占用额外空间的情况下完成。所以如果我用malloc分配内存技术上来说我使用了额外的空间,对吧?

谢谢

不能,特别是当字符串是在堆栈上分配的时候。堆栈空间在编译时是固定的。您必须首先分配更多的空间,或者分配一个具有更多空间和strcpy的新数组。

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

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

在我的面试中,有人问了我一个与此有关的问题。我被要求在不占用额外空间的情况下完成。所以如果我用malloc分配内存技术上来说我使用了额外的空间,对吧?

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

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

对不起,不行。不能调整动态变量/数组的大小。问题是,另一个变量,甚至另一个调用帧可能紧跟在有问题的变量之后。由于代码中可能有指向这些对象的指针,因此不能移动这些对象来腾出空间。

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

似乎适用于c++

不使用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("%sn", s);
    fn(s);
    printf("%sn", s);  
}
输出:

abcd
zzz

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