C:指向uint8_t[]的指针有问题
我正在使用微控制器,并获得以下工作代码: .h文件C:指向uint8_t[]的指针有问题,c,pointers,microcontroller,coap,C,Pointers,Microcontroller,Coap,我正在使用微控制器,并获得以下工作代码: .h文件 const static uint8_t state0[] = "Off"; const static uint8_t state1[] = "ROMLoad"; const static uint8_t state2[] = "RAMLoad"; const static uint8_t state3[] = "PacketSend"; const static uint8_t state4[] = "Process"; .c文件
const static uint8_t state0[] = "Off";
const static uint8_t state1[] = "ROMLoad";
const static uint8_t state2[] = "RAMLoad";
const static uint8_t state3[] = "PacketSend";
const static uint8_t state4[] = "Process";
.c文件
switch (coapapp_vars.state) {
case 0:
packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1);
memcpy(&msg->payload[0], &state0, sizeof(state0) - 1);
break;
case 1:
packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1);
memcpy(&msg->payload[0], &state1, sizeof(state1) - 1);
break;
case 2:
packetfunctions_reserveHeaderSize(msg, sizeof(state2) - 1);
memcpy(&msg->payload[0], &state2, sizeof(state2) - 1);
break;
case 3:
packetfunctions_reserveHeaderSize(msg, sizeof(state3) - 1);
memcpy(&msg->payload[0], &state3, sizeof(state3) - 1);
break;
case 4:
packetfunctions_reserveHeaderSize(msg, sizeof(state4) - 1);
memcpy(&msg->payload[0], &state4, sizeof(state4) - 1);
break;
}
我确实希望通过在切换后调用memcpy来更改此代码以缩短文件(以减少上载的代码)。因此,我需要使用一个指针,通过使用大小写来填充指针,该指针指向.h中的正确值。
不幸的是,我没能让它工作。所以我不知道在哪里我需要使用*或&,或者根本不需要,来让它工作。我尝试过很多不同的方法,但没有一种成功
接下来的问题是:我应该使用什么类型的uint8_t(uint8_t/uint8_t*/uint8_t**)来初始化指向其中一个字符数组的变量?
如何填写(指针)变量(ptr=state/ptr=&state/ptr=&state[0]/…)?
我需要如何在memcpy函数(ptr/&ptr/*ptr/&(*ptr)/…)中使用(指针)变量
我知道我需要使用一个我自己为大小设置的变量
如果需要更多信息:此代码在OpenWSN中使用。我正在使用物联网设备/微控制器。我正在使用他们的COAP实现将信息发送到浏览器
编辑:reserveHeaderSize功能和memcpy功能都将置于开关之后。
正如正确答案所指出的,这很简单,但我一直忽略了一个愚蠢的小错误:在第三个参数中我没有删除sizeof,所以我基本上是在做sizeof(size)。Derp如果我理解正确,您希望在每个
案例中指定一个指针变量,以便以后可以调用memcpy()
。如果是这样,那就简单了。您只需要在每种情况下设置要复制的大小,但您已经提到了
事情就是这样的:
uint8_t *stateptr; // pointers can be assigned to arrays
size_t size;
switch (coapapp_vars.state) {
case 0:
packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1);
stateptr = state0;
size = sizeof state0;
break;
case 1:
packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1);
stateptr = state1;
size = sizeof state1;
break;
// other cases
}
memcpy(&msg->payload[0], stateptr, size-1);
请注意,在您的代码中,您也可以编写
memcpy( &msg->payload[0], state0, sizeof state0 - 1 );
与…,&state0,…
相反,它确实很简单。。。我以前试过这个,但因为一个愚蠢的错误我一直忽略了,所以我没有工作。。。我将sizeof()留在memcpy中,只将state变量替换为size变量,基本上编写了sizeof(size),这显然是错误的。这个问题实际上已经过时了,但我要非常感谢你们!如果不读你的代码,我会一直忽略这个小错误。再一次,非常感谢!总是那些愚蠢的小事把事情弄得一团糟,当我们寻找一些复杂的错误时,隐藏在显而易见的视线中。我确信:-)很高兴我能帮忙注意到,顺便说一句,const static
已经过时了。C希望您使用静态常量
。另外,现在还不清楚为什么您坚持要有多个原始文本副本(每个翻译单元中有一个单独的副本),而不是直接使用原始文本。只是为了能够使用sizeof
?