我需要发送保存在变量中的值。当我尝试在我的有效载荷中传递它时,它会继续引用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
答案 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中的字符串连接起来。试试+
。