2015-04-07 81 views
-2

嘿,伙计们,所以我希望在一个顺序访问特定的索引在列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; 
} 

我希望得到从点1一定的参考价值点2点1,从开始到访问数组。每个都是8个字节,所以我移动了8个。然后我将它添加到j并用j返回。我得到这个数组的方法是使用mmap并读取一些fat.dat文件。首先,我越来越狂野......我不明白。我通过将其值设置为0并将值添加到j之后解除引用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; 
} 

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

+0

目前尚不清楚你想要做什么,而是'的malloc(的sizeof(int)的)'看起来并不像它足够的空间。 –

+1

您能否提供缓冲区,字节1,字节2和预期j的样本数据?另外,j是一个指向int的指针,你想要返回j的值吗?对于这个问题,你为什么动态分配j? – dsolimano

+0

@iharob tbh我刚刚按照链接上的例子。 –

回答

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出于多种原因,包括“你是不是允许使用malloc()”和“当在你的问题误用它泄漏内存”。


而且,老实说,在我看到您的问题更新之前,我写了这段代码! 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; 
} 
+0

(循环初始声明只允许在C99模式下) 这就是为什么我在int声明之外的for循环。至于声明,它不会识别该函数。而且我仍然得到了浮点异常,正如我在编辑问题中指出的那样。 –

+0

好的;有时间得到更好的编译器(支持15年前的标准甚至4年前的标准,而不是25年前的标准)。好;如果你坚持微软给你的东西,我为你感到抱歉。您也必须对调试代码进行一些小的更改。或者指定C99模式('-std = c99',或者如果您使用的是GCC,则可以更好地使用'-std = c11',您可能会得到该消息;您应该学习现代C,而不是古老的东西)。如果你使用GCC或者clang,至少用'-Wall -Werror'编译;最好加上'-Wextra'。 –

+0

我不允许改变我的编译器= [这是你的[debug](http://i.imgur.com/Fiwqq4o.png)的输出。 11和12分别保存00 02的十六进制值,但在你的调试j上仍然是0 = [。感谢您的时间! –