_LoveLinux
关于空指针的问题
各位大虾,请问*void 与**void 类型的指针是否可以相互赋值,如果可以它们之间的值是怎样传递的?
小弟不明白,请指教!谢谢!
[color=Red][size=5][size=6]具体问题见3楼[/size][/size][/color]
[[i] 本帖最后由 _LoveLinux 于 2008-2-15 22:27 编辑 [/i]]
galaxywar
[quote]原帖由 [i]_LoveLinux[/i] 于 2008-2-15 02:24 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7962336&ptid=1052900][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
各位大虾,请问[b]*void 与**void [/b]类型的指针是否可以相互赋值,如果可以它们之间的值是怎样传递的?
小弟不明白,请指教!谢谢! [/quote]
这是什么DD?
_LoveLinux
出在这里:在linux-2.6.11的mm/slab.c文件中的cache_alloc_refill()函数中,调用了
memcpy(ac_entry(ac), &ac_entry(shared_array)[shared_array->avail],sizeof(void*)*batchcount),
memcpy()的原型为
void * memcpy(void * dest,const void *src,size_t count),
ac_entry()的原型为
void ** ac_entry(struct array_cache *ac)
{
return (void**)(ac+1);
}
所以ac_entry()传递给memcpy()的是指针的指针,与memcpy()要求的类型不匹配,[color=DarkOrange]memcpy()的实参是怎样向形参传递的[/color],这点我不理解,还有&ac_entry (shared_array)[shared_array->avail]是什么意思,请各位大虾给小弟指点一下,谢谢!
[[i] 本帖最后由 _LoveLinux 于 2008-2-15 22:25 编辑 [/i]]
熏红猴
不管后面跟几个“*”,指针的存储空间都是一样的,因此,可以相互赋值。
LF_532
[quote]原帖由 [i]_LoveLinux[/i] 于 2008-2-15 04:51 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7962426&ptid=1052900][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
出在这里:在linux-2.6.11的mm/slab.c文件中的cache_alloc_refill()函数中,调用了
memcpy(ac_entry(ac), &ac_entry(shared_array)[shared_array->avail],sizeof(void*)*batchcount),
memcpy()的原型为
vo ... [/quote]
这里ac_entry定义的仅仅限于该函数返回的值为指针的指针。而对该函数存储位置没有影响(ac_entry或&ac_entry)。
“&ac_entry(shared_array)[shared_array->avail]”应该指的是是有多个类似ac_entry的函数在地址上是紧密排列的,占据的地址空间相同的函数。所以这里的意思应该是以ac_entry为起始地址,第shared_array->avail个函数。
[[i] 本帖最后由 LF_532 于 2008-2-15 10:13 编辑 [/i]]
熏红猴
&fun(m)[n]应该是
a = fun(m);
b = &a[n];
这个意思。
[[i] 本帖最后由 熏红猴 于 2008-2-15 10:02 编辑 [/i]]
LF_532
熏红猴, 你是对的。是我没有仔细看清楚。
cugb_cat
相互赋值是没问题的,不过要注意语意的变化。
_LoveLinux
还是不太明白,大家可以详细些吗?
beyond2004
void ** ac_entry(struct array_cache *ac)
{
return (void**)(ac+1);
}
它返回的是 ac数组的下一个成员(一个array_cache 结构体)的地址,不过void ** 和void *是不同的类型,编译的时候应该有warning,你可以当成是强制转换。
_LoveLinux
在&ac_entry(shared_array)[shared_array->avail]为什么要加&呢?