我有一个代表地址的二进制数字数组。我现在想将此地址分为tag
,index
和offset
3个部分或数组,这三个部分的位数由用户确定。
为了更清楚,这是代码:
char* bin_val_addr;
while(fscanf(FP, "%s %lx", str, &addr) != EOF)
{
bin_val_addr = long_to_binary(addr);
char* array_Tag = malloc(no_Tag_bits * sizeof(char*));
char* array_Index = malloc(no_Index_bits * sizeof(char*));
memcpy(array_Tag, bin_val_addr, no_Tag_bits * sizeof(char*));
memcpy(array_Index, bin_val_addr, no_Index_bits * sizeof(char*));
printf("TAG array is: %s\n", array_Tag);
printf("INDEX array is: %s\n", array_Index);
}
函数long_to_binary如下:
char* long_to_binary(unsigned long k)
{
static char c[65];
c[0] = '\0';
unsigned long val;
for (val = 1UL << (sizeof(unsigned long)*8-1); val > 0; val >>= 1)
{
strcat(c, ((k & val) == val) ? "1" : "0");
}
return c;
}
我查看了拆分数组的方法,发现可以使用memcpy
,但是在实现此方法时我出错了。有人可以帮我吗?
答案 0 :(得分:0)
如果bin_val_addr
以1s
,0s
和tag
的顺序包含index
和offset
的序列,则从bin_val_addr
和array_Tag
的{{1}}的开始,例如
array_Index
如果 memcpy(array_Tag, bin_val_addr, no_Tag_bits * sizeof(char*));
memcpy(array_Index, bin_val_addr, no_Index_bits * sizeof(char*));
在array_Index
中{strong>之后 array_Tag
开始,那么您需要将bin_val_addr
的源偏移array_Index
。
(请注意,您是在混合比特和字节(字符no_Tag_bits
和'1'
而不是比特)。因此,除非每个字符需要 8字节, '0'
应该为sizeof(char*)
-始终为sizeof(char)
,并应从您的分配中删除)
例如,分配以保留每个数组中指定的字符(对于 nul-termination 字符为1
),您可以执行以下操作:
+1
,并且您必须验证每个分配,因为 char *array_Tag = malloc(no_Tag_bits + 1);
char *array_Index = malloc(no_Index_bits + 1);
可能并且将因内存耗尽而返回malloc
失败,例如
NULL
将这些片段放在一起并每个字符串 nul-终止,您将拥有:
if (!array_Tag) {
perror ("malloc-array_Tag");
exit (EXIT_FAILURE);
}
现在允许您将数组输出为 strings :
memcpy (array_Tag, bin_val_addr, no_Tag_bits);
array_Tag[no_Tag_bits] = 0;
memcpy (array_Index, bin_val_addr + no_Tag_bits, no_Index_bits);
array_Index[no_Index_bits] = 0;
最后,您在{em> matching 或 input 失败时使用 printf ("TAG array is: %s\n", array_Tag);
printf ("INDEX array is: %s\n", array_Index);
会引发未定义行为,但失败总数少于指定的转换发生。而不是对照fscanf
进行检查,您应该使用实际指定的转化次数进行验证,例如
EOF
进行了这些更改之后,假设您的while (fscanf (FP, "%s %lx", str, &addr) == 2)
可以按预期工作,请告诉我是否还有其他问题。