gpt4 book ai didi

c - 将指针传递给函数不会改变它的值

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:42 24 4
gpt4 key购买 nike

我遇到了一个奇怪的行为。我的 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。

这里有什么问题,为什么?

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

最佳答案

您的问题类似于此常见问题解答:Dynamic memory access only works inside 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]);

关于c - 将指针传递给函数不会改变它的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47225426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com