繁体   English   中英

将指针传递给函数不会改变其值

[英]Passing a pointer to a function doesn't change its value

我面临一个奇怪的行为。 我的C语言知识不足以了解正在发生的事情。

我在Code Composer Studio中使用TI的C编译器(用于CC3220SF)。 正如我通常所做的那样,我编写了以下函数:

unsigned char rxBuf[512];

void ReadID(unsigned char device[])
{
    // this function reads 2 bytes and put them into
    // the global buffer rxBuf;
    FlashMemory_Read(ID_ADDRESS, 2);
    device = &rxBuf[0];
}

(注意:这里我不传递长度,因为它被设计成固定为2)。

这是我的用法:

unsigned char device[2];   
ReadID(device);

正如从许多答案中指出的那样,编译器以相同的方式对待声明为*或[]的参数,其值是第一个元素的地址(指针)。

两种意外行为:

  1. 编译器警告我,在ReadID函数中声明了“ device”变量,但从未引用过
  2. 在调试代码时,我注意到在ReadID函数内部,设备字节指向rxBuf值,但是在调用ReadID()的函数中,它们始终读取0。

这有什么问题,为什么?

预期的行为是,即使ReadID结束,设备变量也应指向rxBuf,因为指针已设置为rxBuf的地址。 而是似乎只在本地更改了地址!

您的问题类似于以下常见问题解答: 动态内存访问仅在function内部起作用

由于数组device[]作为参数传递时会衰减为unsigned char* device ,因此您最终获得了该函数本地的指针device 将该本地副本分配给指向某处的位置意味着它只能持续使用您在该函数内部的时间。

但是由于调用者拥有的是数组,而不是指针,因此这表明您完全误解了数组和指针的工作方式。 最好的建议是重新阅读C编程书籍中的那些章节。

您实际上打算做的可能是这样的:

void ReadID(unsigned char device[])
{
  FlashMemory_Read(ID_ADDRESS, 2);
  device[0] = rxBuf[0];
  device[1] = rxBuf[1];
}

附带说明一下,具有各种功能写入的512字节的全局变量是可怕的程序设计。 正确的设计应具有与此类似的功能:

void FlashMemory_Read(volatile const uint8_t* address, 
                      size_t size, 
                      uint8_t dstbuf[size]);

您仅更改设备指向本地的位置。

您想做的事情大致如下:

void ReadID(unsigned char device[])
{
    // this function reads 2 bytes and put them into
    // the global buffer rxBuf;
    FlashMemory_Read(ID_ADDRESS, 2);
    memcpy(device, rxBuf, 2);
}

还要注意, rxBuf&rxBuf[0]指向内存中的完全相同的地址。

编译器警告我,在ReadID函数中声明了“ device”变量,但从未引用过

该功能中未使用参数device的值,因此该参数没有意义。

考虑到函数参数是其局部变量。

在调试代码时,我注意到在ReadID函数内部,设备字节指向rxBuf值,但是在调用ReadID()的函数中,它们始终读取0。

您试图做的是更改数组,但是数组不是可修改的左值。 声明数组类型的变量时,它不能更改其类型并表示其他数组。

在这次通话中

unsigned char device[2];   
ReadID(device);

用作参数的表达式将转换为类型为unsigned char *的右值,并指向数组device的第一个元素。

您可以通过以下方式想象函数及其调用。 为了清楚起见,我更改了参数名称以区分参数和参数

unsigned char device[2];   
ReadID(device);

//...

void ReadID( /* unsigned char device[] */ )
{
    unsigned char local_device = device;

    // this function reads 2 bytes and put them into
    // the global buffer rxBuf;
    FlashMemory_Read(ID_ADDRESS, 2);
    local_device = &rxBuf[0];
}

因此,您尝试执行的操作没有任何意义。

相反,您可以通过以下方式将值复制到目标数组

void ReadID(unsigned char device[])
{
    // this function reads 2 bytes and put them into
    // the global buffer rxBuf;
    FlashMemory_Read(ID_ADDRESS, 2);
    memcpy( device, rxBuf, 2 );
}

前提是数组rxBuf包含两个实际数据。

我认为所有回答您问题的人都无法理解您的小问题。 您在问arrayc行为/行为就像一个指针,为什么下面的代码行不起作用?

device = &rxBuf[0];//as you assigning the address of first character to
  //your `device array` its not going to work as device is just a character array and not array pointer

它应该像下面

*device = rxBuf[0];

要复制多个字符,可以使用如下所示的for循环。

int i;
for(i=0; i<3; i++){
   *(device + i) = rxBuf[i];
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM