重叠的字符串

时间:2014-08-03 21:45:25

标签: c++ c string char arduino

我遇到重叠char *的问题。

我在低内存环境中工作,即Arduino,我想尽可能少使用内存。我希望能够在另一个字符串前面添加一个字符串,而不需要复制浪费内存的变量。

这是标准的C或C ++。

char* bigPacket = (char*)malloc(25);   //Makes a big string of length 25
char* payload = bigPacket + 2;         //This is part of the big string, 2 chars in.
bigPacket[0] = 72;                     // Letter 'H'
bigPacket[1] = 72;                     //I'm expecting the final bigPacket to read    "HHHello, world"
payload = "Hello, World";
print(bigPacket);

但问题在于它没有打印出“HHHello,world”。相反,它只是打印“HH”。是否有正确的方法使它能够重叠这些字符串以打印“HHHello,world”?

4 个答案:

答案 0 :(得分:0)

您更改了payload点的位置。您需要做的是单独留下payload并更改它指向的数据。

strcpy(payload, "Hello World");

编辑:如果你真的想避免复制,你最终会得到类似SGI Rope类的东西。但是你要付出很多代码复杂性。

答案 1 :(得分:0)

如果你想要在没有非常复杂的代码或多个数据副本的情况下做到这一点,破坏好处,你需要在程序中将完整的字符串作为一个文字:" HHHelloWorld"。然后,您可以使用指针和长度来访问它的各个部分,但请记住,在字符串的末尾只有一个空字节。

但是,我怀疑这是一种过度优化。 Arduino编程很少涉及很多很长的字符串。保持代码简单直接非常重要。

答案 2 :(得分:0)

你不应该乱用那些类似的东西。相反,您应该将字符串文字存储在flash而不是sram内存中。这通常是在progmem macros.的帮助下完成的。"F" macro通常就足够了。然后,您可以根据需要将字符串复制到合适的缓冲区中(如果需要)。

最简单的例子:

Serial.println(F("this is text from flash memory"));

答案 3 :(得分:-1)

您只需指定payload指针指向常量字符串,不要将字符串复制到当前指向的字符串。

要复制字符串,您需要使用strcpy或memcpy:

char *bigPacket = malloc(25);
bigPacket[0] = bigpacket[1] = 72;

strcpy( bigpacket+2, "Hello, World");

print( bigPacket );

请注意,这不太可能节省内存,因为" Hello,world"将作为代码中的常量字符串存在,为了节省内存,多次调用print可能是最有效的。

但是,我想在这种情况下不可能。