C:指向uint8_t[]的指针有问题

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文件

我正在使用微控制器,并获得以下工作代码:

.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文件

        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