【问题标题】:C Language - [copy in place] float* to char* and the reverseC 语言 - [就地复制] float* 到 char* 和相反
【发布时间】:2011-04-05 12:06:41
【问题描述】:

我想将一个浮点缓冲区复制到一个字符(字节)缓冲区,而不为两个单独的缓冲区分配内存。换句话说,我想使用一个缓冲区并就地复制。 问题是,如果我需要一个浮点缓冲区,那么为了将其复制到 char 中,我将需要一个 char* 指针;如果我从 float* 复制到 float* 会很容易,因为我只需为目标和源传递相同的指针。

例如。

void CopyInPlace(float* tar, float* src, int len) {
....
}
CopyInPlace(someBuffer, someBuffer, 2048);

void PackFloatToChar(char* tar, float* src, int len) {

}
????????

我该怎么做?

memcpy 是否复制到位?如果传入相同的指针?

【问题讨论】:

  • 原地复制希望达到什么效果?
  • 您希望将浮点数转换为字符的格式是什么?如果 char* 的空间需要比 float* 更多的空间怎么办?还是将 float* 转换为 char* 您所需要的?
  • 这没有任何意义。 “就地复制”应该是什么意思?如果你只有一个缓冲区,那么你就不能在任何地方复制任何东西。
  • memcpy 不允许这样做,但 memmove 允许源和目标重叠,因此您可以将字节复制到自己的内容中(此评论是开玩笑的。获取您的而是从答案中获得编程建议)
  • 您可以覆盖输入缓冲区,然后将其重新用作输出。当您需要像在嵌入式设备上那样节省内存时,您可以这样做。我只有 1mb 的内存可以使用。无效 CopyInPlaceMult4(int* tar, int* src, int len) { int* val = src; int* end = src + len-1; for( ; val

标签: c pointers programming-languages type-conversion


【解决方案1】:

作为已经推荐的强制转换的替代方法,您可能需要考虑使用联合,例如:

union x { 
    float float_val;
    char bytes[sizeof(float)];
};

这两种方法都不太可能有很大的不同,但您可能会发现一种比另一种更方便或更易读。

【讨论】:

  • 与 gcc 最大的不同是这个解决方案绕过了严格的别名规则。使用另一个编译器无法保证,因为通过另一个字段访问联合,而不是上次写入的字段与转换指针然后在标准中访问它们一样未定义。
【解决方案2】:

如果要将float 指针转换为char 指针,则强制转换就足够了。

float* someBuffer;
...
char* someBuffer2 = (char*)someBuffer;

【讨论】:

    【解决方案3】:

    您的问题似乎有点混乱。

    您是否想简单地将浮点数数组解释为 char 数组(例如写入文件?)。如果是这样,只需投射。 C中所有的指针都可以用char*来表示。

    memcpy 将从一个内存位置复制到另一个内存位置。但请仔细跟踪您的“len”参数是浮点数还是字节数。如果“len”是数组中的浮点数,则在 memcpy 调用中将其乘以 sizeof(float)。

    【讨论】:

    • 嗯,好的 memcpy 工作。但是,将字节解包为浮点数的算法是什么?我将把它作为我的下一个问题发布。谢谢!
    • @juxstapose 您不能使用 memcpy 复制到同一个缓冲区。您需要源/目标重叠的 memmove。
    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多