访问数组 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;
}
大家好,我想按顺序访问数组
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;
}