[英]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
foo()
中的sizeof(pm)
是指針的大小。 不是數組的大小,就像您所假設的那樣。 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.