将分配的内存视为不同的类型
假设我分配了一些内存。
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