【问题标题】:Overlapping strings重叠的字符串
【发布时间】:2014-08-03 21:45:24
【问题描述】:

我遇到了重叠 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”?

【问题讨论】:

  • 你熟悉strcpy吗?
  • 您将指针指向某个字符串文字并期望它复制字符串文字?这里需要strcpy、memcpy等。
  • payload = ..不是“标准 C”,如果 payloadcstring,则只有标准 C++。
  • @Jongware:它怎么不是标准C(虽然不是预期的)? (无论如何,它肯定不是标准的 C++)。
  • 您似乎只是不明白这行代码的作用:payload = "Hello, World";。一旦你理解了它的作用,你应该很清楚如何编写代码来完成你期望那行代码做的事情。

标签: c++ c string char arduino


【解决方案1】:

您更改了payload 指向的位置。您需要做的是让payload 一个人呆着,并更改它指向的数据。

strcpy(payload, "Hello World");

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

【讨论】:

  • 好的,谢谢。现在唯一的问题是,每当我尝试打印 bigPacket 变量时,它只打印 bigPacket 的一部分,而不打印“Hello World”的部分。有什么解决方案吗?谢谢!
  • 我的答案是解决方案。你试过了吗?
  • 啊是的。现在,我使用最初定义的有效负载进行了尝试,但是当我在前面添加字符时,它变得乱七八糟。有任何想法吗?非常感谢!。
  • 这听起来像是另一个问题。您需要提供更多详细信息。 (你明白为什么它适用于strcpy 而不是没有吗?)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你不应该把指针弄乱这样的事情。相反,您应该将字符串文字存储在闪存中而不是 sram 内存中。这通常是在progmem macros. 的帮助下完成的,但通常"F" macro 就足够了。然后,您可以根据需要将字符串复制到合适的缓冲区中。

    最简单的例子:

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

    【讨论】:

      【解决方案4】:

      您只需将payload 指针分配给常量字符串,您不会将字符串复制到它当前指向的位置。

      为了复制你需要使用 strcpy 或 memcpy 的字符串:

      char *bigPacket = malloc(25);
      bigPacket[0] = bigpacket[1] = 72;
      
      strcpy( bigpacket+2, "Hello, World");
      
      print( bigPacket );
      

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

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

      【讨论】:

      • 根据所使用的芯片,字符串文字可能存储在 NVRAM 或闪存中,而不是有限的 1k 堆栈空间。这可能会有所帮助。
      • 嗯,重点是根本不需要使用 malloc ,因为示例是制定的,只需调用 print 几次(print 将数据发送到串行端口,额外的延迟就是通过多次调用它引入的可能性很小,在这种情况下它最多可以节省 32 字节的 RAM)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 2013-07-03
      • 2015-11-23
      • 2017-08-05
      • 1970-01-01
      • 2020-04-27
      相关资源
      最近更新 更多