簡體   English   中英

如何將char數組作為對函數和memcpy的引用傳遞

[英]How to pass char array as reference to a function and memcpy in

自從早上以來,我一直在努力解決這個問題。 “ pd” pm在函數外不會更改。 有人可以告訴我這是什么錯誤嗎?

void foo(u8 *pm, u8 *pd) 
{
    pm = "IWR ";
    memcpy(pd, pm, sizeof(pm));
    printf("in foo pm = %s, pd = %s \n", pm, pd);
}

int main()
{
    u8 pm[5] = "0";
    u8 pd[5] = "IWO ";
    printf("pm = %s, pd = %s \n", pm, pd);  
    foo(pm, pd);
    printf("after pm = %s, pd = %s \n", pm, pd);
}

在調用foo之后,我的最終輸出是pm =(null)和pd =“ IWO”。 我認為“ pm”也會改變價值。

(這是ideone上的代碼,但是在那種情況下pm打印為0而不是(null) 。這是為什么?)

pm = 0, pd = IWO  
in foo pm = IWR , pd = IWR  
after pm = 0, pd = IWR  
  1. 函數foo()中的sizeof(pm)是指針的大小。 不是數組的大小,就像您所假設的那樣。
  2. 我猜你的意思是pm在函數外不會改變,因為給定程序, pd肯定會改變。 pm不變的原因是因為C(以及使用它的C ++)是一種按值傳遞語言。 C FAQ中有一個關於您的問題的問題

您可以使用模板通過引用傳遞數組:

template<typename T, unsigned int Length1, unsigned int Length2>
void foo(T(&pm)[Length], T(&pd)[Length2]) {
    memcpy(pd, "IWR ", Length2 - 2); // - 2 for the NULL
    pd[Length2 - 1] = 0;

    printf("in foo pm = %s, pd = %s \n", pm, pd);
}

並以與以前使用foo相同的方式使用它。 請注意,這僅適用於數組,不適用於指針。

注意

pm = "IWR ";

在原始函數中不執行任何操作(僅修改本地指針變量),並且在此修改后的函數中不起作用(無法分配給數組)。 如果要這樣做,還必須使用memcpy

如果您不想使用模板,則必須將每個數組的大小傳遞給函數(或不使用哨兵值),因為當您將數組傳遞給函數時(不傳遞)參考)衰減到一個指針,而sizeof(array)將為您提供數組中的字節數,而sizeof(pointer)只是為您提供了指針中不需要的字節數。

嗨,通過執行pm =“ IWR”,您更改了pm指向常量引用的位置。 即,您已經完全更改了指針pm(在函數內部)以指向其他位置。

if you do this inside the function your code would work as expected. See why its failing below.


    pm[0] = 'I';
    pm[1] = 'W';
    pm[2] = 'R';

    before foo in main
    ----------
     print pm "0\000\000\000"
     print &pm ==  (u8 (*)[5]) 0x7fbffff7b0

    in foo as soon as we enter
    ------
     print pm = (u8 *) 0x7fbffff7b0 "0" (you are pointing to the same location as in main )
     print pm = (u8 **) 0x7fbffff788

    ----     pm = "IWR" ---
   print pm = 0x400adc "IWR" (now pm is pointing to location in memory where const IWR is stored )
   print &pm = (u8 **) 0x7fbffff788

   ---back to main ---
     print pm =  "0\000\000\000" ( we havent changed anything on location fff7bo so no affect )
     print &pm $8 = (u8 (*)[5]) 0x7fbffff7b0 

Google更改了鏈接列表的標題,您應該可以找到適當的解釋

cslibrary.stanford.edu/103/LinkedListBasics.pdf [看看換頭指示器]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM