【问题标题】:C: pointer references incorrect value [duplicate]C:指针引用不正确的值[重复]
【发布时间】:2018-06-24 02:24:19
【问题描述】:

我需要发送一个保存在变量中的值。当试图在我的有效负载中传递它时,它一直引用 mydata 的初始值,这是不成功的测试。

    static uint8_t *mydatapnt;
    uint8_t *strdata = "Successfull test";
    static uint8_t mydata [] = "Incorrect test";   

    void send(){
      if (LMIC.opmode & OP_TXRXPEND) {
      Serial.println(F("OP_TXRXPEND, not sending"));
      } else {
         // Prepare upstream data transmission at the next possible time.
         LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
         Serial.println(F("Packet queued"));
    /
    }

    void setup(){
     *mydata = mydatapnt;
    }

    void loop(){
     *mydatapnt = strdata;
     Serial.println(*mydatapnt + "");
    }

我到底做错了什么?我应该收到“成功的测试”。 你可以找到完整的代码项目here

【问题讨论】:

  • 首先,启用警告。其次,*mydata = mydatapnt; 并没有按照你的想法去做。
  • strdata 在哪里使用?
  • *mydatapnt = strdata; 是未定义的行为(因为 mydatapnt 未初始化,即使它不是您复制字符串的方式)
  • @Lundin *mydatapnt 应该是 *mtdatapnt = strdata。解决了这个问题。
  • *mydatapnt + "" 不连接。你真的必须阅读字符串。

标签: c arduino


【解决方案1】:

关于字符串...

字符串只是存储字符的内存块(字符数组)。字符串以空字符结束。

要复制字符串,目标字符串中必须有足够的内存。然后使用strcpy 复制字符。 strcpy 附加终止空字符。

字符串的大小由strlen 决定。它不计算终止的空字符。

char *strptr = "my string";

指针指向文字字符串。文字字符串是只读的。尝试修改它通常会导致分段错误或其他终端错误。在:

char myString[] = "my string";

"my string" 的字符被复制到数组myString 中,编译器将其大小设置为初始化字符串的长度加上一个空字符。

要附加到字符串,请使用strcat。同样,目标必须有足够的内存。您可以声明一个具有足够内存的 char 数组,例如 char mystr[100];,也可以使用 malloc 分配内存,例如:

char *strptr= malloc(strlen(myString)+1);
strcpy(strptr, myString);

如果您不再需要从malloc 获得的内存,则必须将其返回给内存分配器:

free(strptr);

在释放内存后尝试使用strptr 也会导致分段错误或其他一些未定义的行为。

【讨论】:

  • Maarten,提示很清楚,您可以自己找出来。有很多可能性;你必须选择一个。试试看,如果有问题再回来。
【解决方案2】:

*mydatapnt = "success in loop";

这不会将指向"success in loop" 字符串的指针存储到mydatapnt,而是将该字符串的地址存储到mydatapnt 的第一个字符中。 (此时mydatapnt没有初始化,所以它破坏了一些随机内存位置。)

你更可能想做的是:mydatapnt = "success in loop";

Serial.println(*mydatapnt + "");

您不是连接字符串,而是将mydatapnt 中的第一个字符的值添加到指向空字符串的指针,这更像是子字符串操作。这可能会打印 something,因为字符串存储在可执行文件中的方式,但绝对不是您想要打印的内容。

你不能用简单的+ 连接 C 中的字符串。试试Serial.println(mydatapnt)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 2016-09-25
    • 2019-05-29
    • 1970-01-01
    • 2013-05-15
    • 2017-01-26
    相关资源
    最近更新 更多