gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:46:20 26 4
gpt4 key购买 nike

假设我分配了一些内存。

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

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

memcpy(buffer, header, 14);

然后我想将剩余的分配空间视为指向 float 的指针。

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

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

transmit(buffer);
my_free(buffer);

这是治疗内存的正确方法吗? float* 可以吗?我遇到了失去值(value)而没有得到正确结果的问题。我的问题是:如果您必须将分配的内存视为不同的类型,然后在处理结束时将其作为 char* 发送......这是正确的方法吗?

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

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

最佳答案

为了使这项工作(至少可移植),您必须(至少)确保 float_buffer 是 sizeof(float) 对齐的。为此,您可以分配 sizeof(float) - 1 个额外字节,观察 malloc 调用对 sizeof(float) 取模的结果,并酌情忽略前几个字节。 (当然,您必须保留原始指针才能进行 free() 调用。)

不过,您可能不想这样做。听起来“缓冲区”的目的是积累要通过网络或类似方式发送的数据,并且 float 将从其他地方复制进来。您真正应该做的是反过来:始终将缓冲区视为 char[],并在复制它们时将源 float 重新解释为一系列字符。也就是

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

关于c - 将分配的内存视为不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4310954/

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