gpt4 book ai didi

c - 指针指向 Void 的内存分配

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:32 24 4
gpt4 key购买 nike

假设我有一个包含 void ** 成员的结构。该成员用作指向数据通道的指针数组。数据类型无关紧要。下面是一个示例,说明我想如何为此二维数组分配内存,然后将 channel 指针与其内存相关联。

#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);

最佳答案

我觉得你的总体想法不错,但是 (void **) malloc(sizeof(DATA_TYPE *) * N_CHANNELS) 让我的蜘蛛感觉刺痛。您为指向 DATA_TYPEN_CHANNELS 指针数组分配空间,但将其视为指向 void 的指针数组。 C 中没有任何东西可以保证 void *DATA_TYPE * 具有相同的大小和表示(除非 DATA_TYPE 恰好是 字符)。因此,您随后对 ppdata[0] = ... 的分配可能会产生垃圾,当它被视为 DATA_TYPE * 的位时(这是您稍后通过 ptr).

我更喜欢这样:

/* overflow check omitted */
DATA_TYPE *storage = malloc(N_CHANNELS * N_SAMPLES * sizeof *storage);
/* error check omitted */

/* overflow check omitted */
DATA_TYPE **pointers = malloc(N_CHANNELS * sizeof *pointers);
/* error check omitted */

for (size_t i = 0; i < N_CHANNELS; i++) {
pointers[i] = storage + i * N_SAMPLES;
}

/* struct member */
void *pdata = pointers;

然后你可以通过以下方式恢复你的指针数组:

DATA_TYPE **pointers = pdata;
do_stuff_with(pointers[i][j]);

从技术上讲,您不需要单独的指针数组,因为您有一个很好的矩形数组。你可以这样做:

/* overflow check omitted */
DATA_TYPE *storage = malloc(N_CHANNELS * N_SAMPLES * sizeof *storage);
/* error check omitted */

/* struct member */
void *pdata = storage;

随后:

DATA_TYPE *storage = pdata;
do_stuff_with(storage[i * N_SAMPLES + j]);

即只需手动计算 ij 的索引即可。

关于c - 指针指向 Void 的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46351423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com