将分配的内存视为不同的类型

假设我分配了一些内存。

char* buffer = (char*)my_malloc(2062);

我将char值分配给先前定义的数组名称头中的前14个字节。

memcpy(buffer, header, 14);

然后我想把剩下的分配空间当作指针来浮动。

float* float_buffer = (float*)(buffer + 14);
some_function(float_buffer);

然后在稍后的某个时刻,我需要发送所有数据。

transmit(buffer);
my_free(buffer);

这是治疗记忆的正确方法吗? 浮球*投射好吗? 我遇到的问题是我正在失去价值,而没有得到正确的结果。 我的问题是:如果你必须将分配的内存视为不同的类型,然后在处理结束时将它作为char *发送......这是正确的方式吗?

我检查了ptr值,当它们是float *和char *时它们是相同的,但我没有得到正确的结果。

我的一个限制是我最初只能从静态缓冲区分配一块内存。 因此,不允许将另一个malloc作为另一个类型(float *)调用。


要做到这一点(至少是可移植的),你必须确保(至少)float_buffer是sizeof(float)对齐的。 你可以通过分配sizeof(float) - 1个额外的字节,观察malloc调用的模数sizeof(float)的结果,并忽略前几个字节来做到这一点。 (当然,为了进行free()调用,你必须保留原始指针。)

不过,你可能不想这样做。 这听起来像'缓冲区'的目的是积累数据通过网络发送或类似的东西,而浮动将被从其他地方复制。 你真正应该做的是另一种方式:将缓冲区作为char []始终处理,并在源文件复制时将源浮点数重新解释为一系列字符。 那是

char* buffer = malloc(total_size);
char* float_start = buffer + header_size;
memcpy(float_start, (char*)float_source, sizeof(float) * float_count);
transmit(buffer, total_size);
free(buffer);

从概念上讲,这是可以的 - 但你必须做一些额外的工作来确保它能可靠地工作。

一个潜在的问题是,你不能以任何float访问任何任意地址。 可能有特定的对齐要求 - malloc()返回的地址需要被正确对齐以作为任何类型的访问,但是一旦您将14添加到该地址,所有投注都将关闭( char除外)。

为确保正确对齐,您必须确保您添加到buffer的地址是sizeof(float)的倍数。 您可以通过使用以下公式添加填充来完成此操作:

#define PAD_OFFSET(offset, type) ((offset) + sizeof(type) - 1) & ~(sizeof(type) - 1))

float *float_buffer = (float *)(buffer + PAD_OFFSET(14, float));

请注意,这会在你的字符和浮点之间创建一个间隙填充。

或者,你可以定义一个struct ,编译器会为你填充。 这使用了一个名为灵活数组成员的C99特性:

struct foo {
    char abc[14];
    float xyz[];
};

struct foo *buffer = malloc(2062);
memcpy(&buffer->abc, header, 14);
some_function(&buffer->xyz);
transmit(buffer); /* Presuming transmit() expects a void * parameter. */

如果你希望没有填充,你不能直接访问buffer的内存作为浮动 - 你将不得不创建一个临时数组并将其复制到:

float temp[500]; /* Or whatever size */
some_function(&temp);
memcpy(buffer + 14, temp, sizeof temp);

我在这里推测,但是因为malloc的原型是

void *malloc(size_t size);

你本质上是将类型为void *的缓冲区转换为char *,所以稍后再将另一块缓冲区转换为float *就没有问题,只要你正确地处理指针会计。

链接地址: http://www.djcxy.com/p/80205.html

上一篇: treating allocated memory as a different type

下一篇: Using malloc in C to allocate space for a typedef'd type