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

时间:2016-07-11 16:08:19

标签: c arrays

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

此外我的代码崩溃了,下面的一段代码也提供给了我..但它崩溃了我的系统,不知道为什么。

rawDataPtr是我的字节数组,因为你可以猜测我感兴趣的值是从positon 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;
}

1 个答案:

答案 0 :(得分:1)

  

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

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

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

......但在实践中不太可能产生任何影响。

你的功能本身就很好。特别是,

  1. 像访问data[0] ... data[3]一样没有问题,只要 data是有效指针, data[3]不构成尝试超出data指向的对象(in)的范围。在您使用的用法中,对应于rawDataPtr是至少7个字节的数组。

  2. 允许写入一个联合的一个元素,然后从另一个元素中读取,尽管有一些警告。特别是,您的代码假定float的大小为4个字节;如果它们在您的系统上更长,则您的代码具有未指定的行为。

  3. 附加说明:

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

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

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

    总的来说,如果函数崩溃你的程序,那是因为你正在为它提供坏数据。在这种情况下,调用者的rawDataPtr可能不是有效指针(并注意它的名称表明它是指针而不是数组),或者指向更少的指针在对象结束之前的四个字节,或它指向的字节在转换时形成陷阱表示。