指针传递返回意外错误

时间:2014-02-05 17:02:53

标签: c pointers

我正在使用atmega16做一个简单的例子

void uartrecieve(unsigned char * data1)
{
    data1="on";

}


int main(void)
{
    unsigned char *z;
    DDRC=0xFF;
    uartinit();
    while(1)
    {
        uartrecieve(z);

        if(strcmp(z,"on")==0)
        {
            PORTC =0xff;
            _delay_ms(6000);
        }   
        else
        {
            PORTC=0x03;
        _delay_ms(6000);
        }
   }

}

我的问题是这个...为什么它总是打印0x03 ...不是2个值应该相等,因此它应该在PORTC上打印0xFF!

4 个答案:

答案 0 :(得分:3)

您没有更新实际的字符串指针。

以下代码将执行您想要的操作:

void uartrecieve(unsigned char ** data1)
{
    *data1 = "on";
}


int main(void)
{
    unsigned char *z;
    DDRC=0xFF;
    uartinit();
    while(1)
    {
        uartrecieve(&z);

        if(strcmp(z,"on")==0)
        {
            PORTC =0xff;
            _delay_ms(6000);
        }
        else
        {
            PORTC=0x03;
            _delay_ms(6000);
        }
   }
}

答案 1 :(得分:2)

您不能只为char *分配值来复制字符串,您必须使用strcpymemcpy。但是你的问题是你没有为复制的字符串分配内存,所以你也需要这样做。

在示例中我分配了256个字节,如果你想通过uart接收一些真实的东西,我认为应该足够吗?否则你需要动态或静态地放大它。或者你可以把它读成块。

#define UARTBUFFERSIZE 256

void uartrecieve(unsigned char * data1)
{
    /* Copy a maximum of 255 byte + 1 zero byte*/
    strncpy(data1, "on", UARTBUFFERSIZE -1);
    /* Make sure it's zero terminated */
    data1[UARTBUFFERSIZE -1] = 0;
}


int main(void)
{
    unsigned char z[UARTBUFFERSIZE];
    DDRC=0xFF;
    uartinit();
    while(1)
    {
        uartrecieve(z);
        if(strcmp(z,"on")==0)
        ...
    }

}

答案 2 :(得分:0)

您可能需要将指针传递给指针:

void uartrecieve(unsigned char **data1)
{
    *data1="on";
}

并称之为:

uartrecieve(&z);

或者,您可以在Juri Robl中建议answer

答案 3 :(得分:0)

uartrecieve()填充已经分配空间的数组。

void uartrecieve(unsigned char *data1, size_t n) {
  strncpy(data1, "on", n);
}

int main(void) {
  unsigned char z[80];
  ...
  {
    uartrecieve(z, sizeof z);
    if(strcmp(z,"on")==0) 
    ...