簡體   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