传递给 sg_init_table() 函数的散点列表指针是否需要在之前分配?
Does scatter list pointer passed to sg_init_table() function need to be allocated before?
在 linux 内核 PCI 驱动程序模块中。
我们有一个函数来初始化 dma 散点列表:
sg_init_table(struct scatterlist *sg, unsigned int nents);
对于散点列表指针sg
,我们是否应该为它分配一些内存,比如使用kcalloc
;
或者我们只是像这样声明它:struct scatterlist * sg
然后将它传递给 sg_init_table
?
感谢提前。
除了简单地用预期类型的参数填充函数的参数列表之外,将任何类型的未初始化或无效指针值传递给任何函数对调用者没有任何价值。调用者不会以这种方式向函数传递任何有效信息,也不会为函数提供 return 任何信息的机制。特别是,它没有提供被调用函数可以代表调用者分配内存的机制。与任何其他参数一样,指针通过值传递,因此当函数修改其参数之一时,调用者不可见。
您提供的函数签名仅对初始化 现有 类型的 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()
的行为方式的详细信息。
类似地,传递 global 结构的地址可能是合适的。请注意局部对象的生命周期——除非声明 static
,否则局部对象不会在声明它们的函数调用结束后继续存在。
在 linux 内核 PCI 驱动程序模块中。
我们有一个函数来初始化 dma 散点列表:
sg_init_table(struct scatterlist *sg, unsigned int nents);
对于散点列表指针sg
,我们是否应该为它分配一些内存,比如使用kcalloc
;
或者我们只是像这样声明它:struct scatterlist * sg
然后将它传递给 sg_init_table
?
感谢提前。
除了简单地用预期类型的参数填充函数的参数列表之外,将任何类型的未初始化或无效指针值传递给任何函数对调用者没有任何价值。调用者不会以这种方式向函数传递任何有效信息,也不会为函数提供 return 任何信息的机制。特别是,它没有提供被调用函数可以代表调用者分配内存的机制。与任何其他参数一样,指针通过值传递,因此当函数修改其参数之一时,调用者不可见。
您提供的函数签名仅对初始化 现有 类型的 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()
的行为方式的详细信息。
类似地,传递 global 结构的地址可能是合适的。请注意局部对象的生命周期——除非声明 static
,否则局部对象不会在声明它们的函数调用结束后继续存在。