从早上开始我就一直在努力解决这个问题。值'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常见问题解答中有一个问题正是关于您的问题
您可以使用模板通过引用传递数组:
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 "0 00 00 00"
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 00 00 00" ( we havent changed anything on location fff7bo so no affect )
print &pm $8 = (u8 (*)[5]) 0x7fbffff7b0
谷歌更改了链接列表的标题,你应该能够找到正确的解释
cslibrary.stanford.edu/103/LinkedListBasics.pdf[看看改变头指针]