如何将char数组作为对函数的引用并在中传递memcpy



从早上开始我就一直在努力解决这个问题。值'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常见问题解答中有一个问题正是关于您的问题

您可以使用模板通过引用传递数组:

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

如果你不想使用模板,那么你必须将每个数组的大小传递给函数(或者使用一个sentinel值,但不要),因为当你将数组传递给函数时(不通过引用传递),它会衰减到一个指针,而sizeof(array)会给你数组中的字节数,sizeof(pointer)只是给你指针中的字节数量,这不是你想要的。

嗨,通过执行pm="IWR",您已经更改了pm指向常量引用的内容。i.,e你已经完全改变了指针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 "0000000"
     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 =  "0000000" ( we havent changed anything on location fff7bo so no affect )
     print &pm $8 = (u8 (*)[5]) 0x7fbffff7b0 

谷歌更改了链接列表的标题,你应该能够找到正确的解释

cslibrary.stanford.edu/103/LinkedListBasics.pdf[看看改变头指针]

最新更新