【发布时间】:2018-03-03 05:57:45
【问题描述】:
假设我有一个带有 void ** 成员的结构。该成员用作指向数据通道的指针数组。数据类型无关紧要。下面是一个示例,说明我想如何为这个二维数组分配内存,然后将通道指针与其内存相关联。
#define N_CHANNELS (/*Number of data channels*/)
#define N_SAMPLES (/*Number of data samples per channel*/)
typedef /*Some data type*/ DATA_TYPE;
void **ppdata; /*Conceptual struct member*/
/*Allocate memory for array of data channels */
ppdata = (void **) malloc(sizeof(DATA_TYPE *) * N_CHANNELS);
ppdata[0] = malloc(sizeof(DATA_TYPE) * N_CHANNELS * N_SAMPLES);
/*Cast for pointer arithmetic and data access*/
DATA_TYPE **ptr = (DATA_TYPE **) ppdata;
/*Associate channels with their memory*/
int alloc_index;
for (alloc_index = 0; alloc_index < N_CHANNELS; alloc_index++)
{
ptr[alloc_index] = (*ptr + alloc_index * N_SAMPLES);
}
那么,问题来了:这种取消引用和分配行为是否像我假设的那样?
ppdata[0] = malloc(sizeof(DATA_TYPE) * N_CHANNELS * N_SAMPLES);
即,这种分配是否与我以后访问内存的方式兼容?
DATA_TYPE **ptr = (DATA_TYPE **) ppdata;
...
ptr[alloc_index] = (*ptr + alloc_index * N_SAMPLES);
【问题讨论】:
-
@4386427 我已经使用第二个 malloc() 语句为所有通道分配了内存,因为我需要所有通道的数据都在连续的内存中。我在 for 循环中为 ppdata[1], ..., ppdata[N_CHANNELS -1] 分配了适当的地址。
-
typedef DATA_TYPE;是typedef int DATA_TYPE;这是在编译时确定的。 -
@BLUEPIXY typedef 仅用于说明目的。在这个想法的应用中,数据类型将以另一种方式传递。
-
虽然
void *是C 中的“通用”指针类型,但事实证明void **不能可移植地用作通用指针到指针。所以你的DATA_TYPE **ptr = (DATA_TYPE **)ppdata是可疑的。见c-faq.com/ptrs/genericpp.html -
@4386427 循环的目的是初始化,而不是取消引用。
标签: c pointers memory memory-management void-pointers