首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递指向函数的指针不会更改其值

传递指向函数的指针不会更改其值
EN

Stack Overflow用户
提问于 2017-11-10 14:49:59
回答 4查看 658关注 0票数 1

我正面临着一种奇怪的行为。我的C知识不足以理解正在发生的事情。

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

代码语言:javascript
复制
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)。

在这里,我如何使用它:

代码语言:javascript
复制
unsigned char device[2];   
ReadID(device);

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

有两种意想不到的行为:

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

这里出了什么问题,为什么?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-10 16:55:53

我想所有回答你问题的人都听不懂你的小问题。当arrayc中表现/表现得像一个指针时,您会问为什么下面的代码行不能工作?

代码语言:javascript
复制
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

应该如下所示

代码语言:javascript
复制
*device = rxBuf[0];

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

代码语言:javascript
复制
int i;
for(i=0; i<3; i++){
   *(device + i) = rxBuf[i];
 }
票数 2
EN

Stack Overflow用户

发布于 2017-11-10 14:58:48

您的问题类似于这个常见问题:Dynamic memory access only works inside function

由于数组device[]在作为参数传递时会衰减为unsigned char* device,因此您将得到一个指针device,它是该函数的本地指针。将本地副本分配到某个位置意味着它只会在函数中持续很长时间。

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

你真正想要做的可能是这样的事情:

代码语言:javascript
复制
void ReadID(unsigned char device[])
{
  FlashMemory_Read(ID_ADDRESS, 2);
  device[0] = rxBuf[0];
  device[1] = rxBuf[1];
}

顺便提一句,有一个全局变量512字节的各种函数写入,是可怕的程序设计。正确的设计应该是有一个类似于此的功能:

代码语言:javascript
复制
void FlashMemory_Read(volatile const uint8_t* address, 
                      size_t size, 
                      uint8_t dstbuf[size]);
票数 3
EN

Stack Overflow用户

发布于 2017-11-10 15:04:34

您只是在更改设备指向本地的位置。

你想要做的是沿着这条路线:

代码语言:javascript
复制
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]指向内存中完全相同的地址。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47225426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档