gpt4 book ai didi

c - 在 C 中的特定位置传递数组

转载 作者:行者123 更新时间:2023-11-30 15:07:18 25 4
gpt4 key购买 nike

我有一个字节数组,如果我只想在该数组的特定位置中有 X 个字节,我想知道这是否有效。

我的代码也在这里崩溃了,向我提供了以下代码..但它在我的系统上崩溃了,不知道为什么。

rawDataPtr 是我的字节数组,您可以猜测我感兴趣的值从位置 4 开始。

float TempFloat = COMMON_ConvertByteArrayToFloat(&rawDataPtr[3]);

现在是函数。

union {
uint8_t tmpArray[4];
float tmpFloat;
}value;

float COMMON_ConvertByteArrayToFloat(uint8_t *data) {

value.tmpArray[0] = data[3];
value.tmpArray[1] = data[2];
value.tmpArray[2] = data[1];
value.tmpArray[3] = data[0];

return value.tmpFloat;
}

最佳答案

I have an array of bytes, if I just want X number of bytes in a specific location of that array, I am wondering if this is valid.

假设“数组”rawDataPtr至少有四个元素,&rawDataPtr[3]是指向第四个的有效指针。如果元素类型与 uint8_t 不同那么从技术上来说你应该转换为 uint8_t *当你将它传递给你的函数时:

float TempFloat = COMMON_ConvertByteArrayToFloat((uint8_t *) &rawDataPtr[3]);

...但实际上这不太可能产生任何影响。

你的函数本身就很好。特别是,

  1. 访问 data[0] 没有问题... data[3]和你一样,只要 data是一个有效的指针,并且引用 data[3]不构成读取 data 对象范围之外的尝试。点。在您提供的用法中,对应于 rawDataPtr是至少 7 个字节的数组。

  2. 允许写入 union 的一个元素,然后从另一个元素读取,但有一些注意事项。特别是,您的代码假设 float s 的大小为四个字节;如果它们在您的系统上较长,则您的代码具有未指定的行为。

附加说明:

  • 我认为您有意反转数组中的字节顺序以形成 float 的值。这是否合适取决于您的特定数据。

  • 如果要通过 union 执行字节 -> 浮点转换,则建议使用函数本地的 union 对象。您目前似乎正在使用文件范围的实例。

  • 您的函数完全能够在value.tmpFloat中生成陷阱表示。 ,然后尝试读取并返回该值。如果这样做,则结果行为是未定义的。

总的来说,如果该函数使您的程序崩溃,那是因为您向其提供了错误的数据。在这种情况下,很可能是调用者的 rawDataPtr不是一个有效的指针(请注意,它的名字表明它是一个指针而不是一个数组),或者它指向对象末尾之前少于四个字节,或者它指向的字节转换后,点形成陷阱表示。

关于c - 在 C 中的特定位置传递数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38311515/

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