访问数组 C 中的特定索引

Accessing a specific indexes in an array C

大家好,我想按顺序访问数组

int get_value_from_array(char* buffer, int byte1, int byte2) {
    int i;
    int *j;
    j = malloc(sizeof(int));
    *j= 0;

    for(i = 0; i < byte2 - byte1; i++) {
        *j += (buffer[byte1+i] << (i*8));       
    }

    return j;
}

我希望从 point1 开始从 point1 到 point2 获取一些值。每个都是 8 个字节,所以我移动了 8 个字节。我将它添加到 j 并用 j 返回它。我得到这个数组的方法是使用 mmap 并读取一些 fat.dat 文件。首先,我得到了非常疯狂的价值观……我不明白。我取消引用 j,方法是将其值设置为 0,然后将值添加到 j

我也一直关注这个example。我不允许使用 malloc 来解决这个问题,但我更加困惑。我试图在没有指针的情况下使用它,但后来我会得到浮点异常。

你能帮我解决这个问题吗?

==========编辑=====================
好吧,也许我的问题不够清楚=[

int get_value_from_array(char* buffer, int byte1, int byte2) {
    int i;
    int j = 0;

    for(i = 0; i < byte2 - byte1; i++) {
        j += (buffer[byte1+i] << (i*8));        
    }

    return j;
}

这是我第一次尝试让这个东西工作,但我一直收到浮点异常。我搜索了一些东西,发现另一种方法是将值转换为指针并取消引用它。我做了一些尝试,但效果不是很好(或者至少返回了最随机的值 + 有时是段错误)。我希望这能澄清我想做的事情。

这可能就是您想要的。

int get_value_from_array(char* buffer, int byte1, int byte2)
{
    int j = 0;
    assert(buffer != 0);
    assert(byte1 >= 0 && byte2 >= byte1 && (size_t)(byte2 - byte1) < sizeof(int));

    for (int i = 0; i < byte2 - byte1; i++)
        j += (unsigned char)buffer[byte1+i] << (i*8);

    return j;
}

如我的评论所述,出于多种原因,您真的不想分配 int *j,包括 "you aren't allowed to use malloc()" 和 "it leaks memory when misused as in your question"。


老实说,我在看到您对问题的更新之前写了这段代码! assert()(unsigned char) 转换是您的原始代码与此代码之间的唯一区别。我不确定你是如何从中得到浮点异常的。如果除以零,您可以获得其中之一,但您的代码中没有明显的除法,更不用说除以零了。

您应该返回到原始代码并在运行时打印出所有信息。或者使用调试器单步调试。

int get_value_from_array(char* buffer, int byte1, int byte2)
{
    int j = 0;
    printf("-->> %s: %p (%d..%d)\n", __func__, buffer, byte1, byte2);
    assert(buffer != 0);
    assert(byte1 >= 0 && byte2 >= byte1 && (size_t)(byte2 - byte1) < sizeof(int));

    for (int i = 0; i < byte2 - byte1; i++)
    {
        printf("j0 = 0x%.8X, i = %d, byte = 0x%.2X, "
               "add = 0x%.8X, j1 = 0x%.8X\n",
               j, i, (unsigned char)buffer[byte1+i],
               (unsigned char)buffer[byte1+i] << (i*8),
               j + (unsigned char)buffer[byte1+i] << (i*8));
        j += (unsigned char)buffer[byte1+i] << (i*8);
    }

    printf("<<-- %s: 0x%.8X\n", __func__, j);
    return j;
}

请注意,打印以换行符结束。在C99中,__func__是函数名;如果您有 C89/C90,请省略,并删除 %s — 或将 %s 替换为您的函数名称(或将 __func__ 替换为您的函数名称作为字符串文字:"get_value_from_array").

在C89/C90中编写的可调试代码:

int get_value_from_array(char* buffer, int byte1, int byte2)
{
    static const char func[] = "get_value_from_array";
    int i;
    int j = 0;
    printf("-->> %s: %p (%d..%d)\n", func, buffer, byte1, byte2);
    assert(buffer != 0);
    assert(byte1 >= 0 && byte2 >= byte1 && (size_t)(byte2 - byte1) < sizeof(int));

    for (i = 0; i < byte2 - byte1; i++)
    {
        printf("j0 = 0x%.8X, i = %d, byte = 0x%.2X, "
               "add = 0x%.8X, j1 = 0x%.8X\n",
               j, i, (unsigned char)buffer[byte1+i],
               (unsigned char)buffer[byte1+i] << (i*8),
               j + (unsigned char)buffer[byte1+i] << (i*8));
        j += (unsigned char)buffer[byte1+i] << (i*8);
    }

    printf("<<-- %s: 0x%.8X\n", func, j);
    return j;
}