gpt4 book ai didi

c - 访问数组 C 中的特定索引

转载 作者:行者123 更新时间:2023-11-30 20:05:44 24 4
gpt4 key购买 nike

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

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开始到point2的一些值。每个都是 8 个字节,因此我移动了 8 个字节。我将其添加到 j 中,并使用 j 返回它。我获取此数组的方法是使用 mmap 并读取一些 fat.dat 文件。首先,我得到了非常疯狂的值(value)观......我不明白。我通过将其值设置为 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;
}

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

最佳答案

这可能就是您所追求的。

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

关于c - 访问数组 C 中的特定索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29481778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com