我正在做项目的一部分,这与直接映射的缓存有关。在下面的代码中,我为缓存元素创建了一个结构:

typedef struct node{
  int *tagBits;
  int *setBits;
  int *blockOff;
} cacheNode;


我想在每个元素中存储相应的块偏移位,设置位和标记位。

例如,给定的内存地址的二进制是:000000000000000000001001110011001001001110101000100。我希望前两位是块偏移,后两位是设置位,其后是其余的44个标记。结果应为blockOff = 00,setBit = 01 tag = rest。参数:blockOff,setBits和tagBits代表二进制中有多少位(blockOff = 2,set = 2和tag = 44)。这是我到目前为止尝试过的:

void directMap(cacheNode** cache,int blockOff, int setBits, int
tagBits,int* binary)
{
int tagDec, blockDec, setDec, i= 0;
cacheNode* element = (cacheNode*)malloc(sizeof(cacheNode));

element->blockOff = (int*)malloc(blockOff * sizeof(int));
element->setBits = (int*)malloc(setBits * sizeof(int));
element->tagBits = (int*)malloc(tagBits * sizeof(int));

for(i = 0; i< 48; i++){
  if(i = 0 && i < blockOff){
    element->blocOff[i] = binary[i];
  }
  else if(i = (blockOff) && i < (blockOff + setBits)){
    element->setBits[i] = binary[i];
  }
}

 printString(element->blockOff,blockOff);
 printString(element->setBits,setBits);
}


我的问题是,当我从结构中打印出两个整数数组时,它为set和blockOff给出了“ 00”。答案对于blockOff是正确的,但未设置,设置应为'01'。有什么提示吗?

最佳答案

for(i = 0; i< 48; i++){
  if(i = 0 && i < blockOff){

  // Does not executes when above `if()` is true when `blockOff` is positive.
  else if(i = (blockOff) && i < (blockOff + setBits)){


使用i肯定是错误的。 if(i = 0 && i < blockOff)继续重新分配i=是分配。 ==用于比较。

改成

for(i = 0; i< 48; i++){
  if(i == 0 && i < blockOff){
  else if(i == (blockOff) && i < (blockOff + setBits)){




这也意味着并非所有警告都已启用。节省时间,启用所有编译器警告。



可能存在其他问题。



提示:避免malloc编码错误。简化并分配给取消引用的对象。

// element->blockOff = (int*)malloc(blockOff * sizeof(int));
element->blockOff = malloc(sizeof *(element->blockOff) * blockOff);

07-26 09:30