C:指针引用不正确的值

时间:2018-01-15 12:41:32

标签: c arduino

我需要发送保存在变量中的值。当我尝试在我的有效载荷中传递它时,它会继续引用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

2 个答案:

答案 0 :(得分:2)

关于字符串......

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

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

字符串的大小由strlen确定。它不计算终止null charcter。

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也会导致分段错误或其他一些未定义的行为。

答案 1 :(得分:1)

  

new

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

您更有可能做的是:mydatapnt

  

mydatapnt = "success in loop";

你没有连接字符串,而是将Serial.println(*mydatapnt + "");中的第一个char的值添加到指向空字符串的指针,这更像是子字符串操作。这可能会打印某些东西,因为字符串存储在可执行文件中的方式,但并不是你想要它打印的内容。

您无法使用简单mydatapnt将C中的字符串连接起来。试试+