访问数组C中的特定索引

时间:2015-04-07 00:28:05

标签: c arrays segmentation-fault

嘿伙计,所以我希望按顺序访问数组

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文件。首先,我变得非常疯狂......我不明白。我通过将其值设置为0并在之后将值添加到j来取消引用j

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

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

========== EDIT =====================
好吧也许我的问题不够明确= [

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

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

1 个答案:

答案 0 :(得分:3)

这可能是你所追求的。

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,包括&#34;您不能使用malloc()&#34 ;并且&#34;它在你的问题中被误用时会泄漏记忆&#34;。


说实话,我在看到你对这个问题的更新之前写了这段代码! 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;
}