嘿伙计,所以我希望按顺序访问数组
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错误)。我希望这能澄清我想做的事情。
答案 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;
}