在Linux内核PCI驱动程序模块中
我们有一个初始化dma分散列表的功能:
sg_init_table(struct scatterlist *sg, unsigned int nents);
对于散点列表指针sg
,我们是否应为其分配一些内存,例如使用kcalloc
;
或者我们只是声明它:struct scatterlist * sg
然后将其传递给sg_init_table
?
预付款。
答案 0 :(得分:2)
调用程序在将任何类型的未初始化或无效指针值传递给任何函数时没有任何价值,除了简单地用函数的参数列出预期类型的参数。调用者没有向该函数传递有效信息,并且它没有提供函数返回任何信息的机制。特别是,它没有提供一种机制,被调用的函数可以通过该机制代表调用者分配内存。与任何其他参数一样,指针通过值传递,因此当函数修改其中一个参数时,调用者看不到它。
您提供的函数签名仅适用于初始化类型为struct scatterlist
的现有对象,或此类对象的数组,或用于保存此类对象或数组的已分配内存。如果需要动态分配该结构然后是,则调用者必须执行分配并将指针传递给结果。
但是,在某些情况下,调用者可能适合声明本地struct
对象,并传递其地址,如下所示:
struct scatterlist sl;
sg_init_table(&sl, DEFAULT_NENTS);
或者
struct scatterlist sl[DEFAULT_NENTS];
sg_init_table(sl, DEFAULT_NENTS);
,具体取决于sg_init_table()
的行为方式。
同样,它可能适合传递全局结构的地址。请注意本地对象的生命周期 - 除非声明static
,否则本地对象不会在声明它们的函数调用结束时继续存在。