【发布时间】:2018-09-16 21:53:53
【问题描述】:
我有一个代表地址的二进制数字数组。我现在想将此地址分成 3 个部分或数组,它们是 tag、index 和 offset,这三个部分的位数由用户确定。
为了更清楚,这是代码:
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,但是在实现它时我在某个地方出错了。有人可以帮我吗?
【问题讨论】:
-
例如,如果您想在字符串中存储 1010,那么该字符串的长度至少需要 5 个字符(4 个字符用于保存 1010,1 个字符用于保存字符串的空终止符)。您的代码在应该分配 5 个字符时错误地分配了 4 个字符指针。这里还有其他问题,例如从 long_to_binary() 函数返回 'c' 的方式需要改变。
-
好的,所以我必须更改
sizeof(char*)语句对吗? -
是的,如果你想分配一个可以容纳N个字符的字符串那么你需要malloc(N+1),而不是malloc(N * sizeof(char *))。
-
为什么我返回 c 的方式不对?
-
啊,它是静态的。之前没有注意到。在那种情况下没关系(我不是一个大粉丝,但它会起作用)。