我正面临着一种奇怪的行为。我的C知识不足以理解正在发生的事情。
我在中使用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);正如许多答案所指出的,编译器以相同的方式对待声明为*或[]的参数,其值是指向第一个元素的地址(指针)。
有两种意想不到的行为:
这里出了什么问题,为什么?
即使在rxBuf结束时,设备变量也应该指向ReadID,因为指针已经设置为rxBuf的地址。相反,地址似乎只在本地更改!
发布于 2017-11-10 16:55:53
我想所有回答你问题的人都听不懂你的小问题。当array在c中表现/表现得像一个指针时,您会问为什么下面的代码行不能工作?
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];
}发布于 2017-11-10 14:58:48
您的问题类似于这个常见问题: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]);发布于 2017-11-10 15:04:34
您只是在更改设备指向本地的位置。
你想要做的是沿着这条路线:
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]指向内存中完全相同的地址。
https://stackoverflow.com/questions/47225426
复制相似问题