我即将为程序创建一个函数,这是程序的一部分,并且是一个位图,用于保存哪些内存地址可以自由使用的控件(这与此函数无关) 。位图是位[64],其保持8×64位,下面的函数是取一个参数号,该参数号是该函数应占用的数据块的数量。在数组data_blocks []中,数字块的编号应为位值0(空闲)。
执行这个程序会产生一些奇怪的输出,而data_blocks []会给出超过512的值。有人可以帮我一把吗?感谢
#include <stdio.h>
#include <string.h>
void occupyDataBlocks(int number)
{
int ab = number;
char bit[512/8];
int bitNum = 0;
int count;
int data_blocks[ab];
int b;
for(bitNum = 0; bitNum < (sizeof(bit)/sizeof(char)); bitNum++) {
char x = bit[bitNum];
for(count = 0; x != 0; x >>= 1 ) {
if(!(x & 0)) {
data_blocks[count] = count;
}
if(count == number) {
break;
}
count++;
}
if(count == number) {
break;
}
}
if(count == number) {
int a;
for(a = 0; a < 5; a++) {
printf("%d\n", data_blocks[a]);
}
} else {
printf("Not enough data blocks\n");
}
}
int main(void)
{
occupyDataBlocks(3);
return 1;
}
答案 0 :(得分:2)
k,从哪里开始...
1)“sizeof(char)”很可能是1.所以你有一个512字节的数组,而不是64字节的数组。
2)“bit”数组未初始化。
3)赋值“char x = bit [bitNum];”应该出现在循环内。
4)“strlen(bit)”没有做你想象的那样。它将“bit”解释为文本字符串。您可能想要使用“sizeof(bit)/ sizeof(char)”。
5)“(x&amp; 0)”总是评估为0.你想做什么?如果您正在尝试测试该位,则需要执行“!(x&amp; 1)”。
6)“int data_blocks [number]”:这甚至可以编译吗?如果在编译时不知道它的大小,则无法分配这样的本地数组。
7)if(count == number){ 打破; }
只会让你脱离内循环。外循环继续不间断。
8)你真的想在外循环的每次迭代中将“count”重置为0吗?您是否希望代码在阵列中的某个位置找到3个空闲位置,或者在单个字节中找到3个空闲位置?