我的问题与通过传递数组地址将整数数组传递给函数有关。整数数组在函数外部正常工作,但不在函数内部。我写的大部分内容只是为了提供一些可能有用或不有用的额外细节。为了得到问题的真正要点,你可以跳到TL;DR的底部。
有两种结构:
lineType是由两个整数值(valid和tag)组成的结构
typedef struct
{
int valid;
int tag;
} lineType;
setType是一个结构,由指向一组行的指针和指向一组整数的指针组成。
typedef struct
{
lineType * lines;
int * iruQueue;
}
我有一个指向一组名为cache的集合类型的指针(对于熟悉计算机系统的人来说,这个对象用于表示一个cache系统。缓存有许多集合,每一个集合都有若干行,其中包含一个标记、一个指示行是否包含有效信息的位和一个用于该行包含的实际信息的字节偏移量。这些都不是我的主要问题所必需的,但我认为这可能会澄清我正在试图做的事情)。
所以我们有setType*cache。
我已经创建了一个函数,它将为缓存分配适当的空间,称为initCache。再说一遍,我不确定这些信息是否必要,但我想把我能提供的所有细节都扔掉。
setType * initCache(int NoSets, int NoLines)
int i, j;
setType * cache;
//allocates the appropriate space for the sets
cache = malloc(sizeof(setType) * NoSets);
for(i = 0; i < NoSets; i++)
{
//allocates the space for the lines and the integer array
cache[i].lines = malloc(sizeof(lineType) * NoLines);
cache[i].iruQueue = malloc(sizeof(int) * NoLines);
}
//initializes all valid bits to 0 and the iruQueue entries to -1
for(i = 0; i < NoSets; i++)
for(j = 0; j < NoLines; j++)
{
cache[i].lines[j].valid = 0;
cache[i].iruQueue[j] = -1;
}
return cache;
}
这就是缓存构造函数。没有问题。我还写了很多代码,但经过彻底的测试,它们都能正常工作。
背景知识:iruQueue整数数组用于跟踪集合中最近访问最少的行。例如:我有四行,数组被初始化为一个int*,看起来像(-1,-1,-1,-1,-1)。已访问行0。(0,-1,-1,-1)。进入1号线。(0,1,-1,-1)。访问第2行(0,1,2,-1)。再次访问第0行。(1,2,0,-1)
我的问题是:在某个时刻,我想将整数数组传递给一个函数,该函数将在缓存中修改它。为此,我有两个函数,enqueue和dequeue。这是排队函数。
void enqueue(int ** iruQueue, int noLines, int lineNo)
{
int cached = 0;
int i;
for(i = 0; i < noLines; i++) {
if(*iruQueue[i] == -1 && cached == 0) {
*iruQueue[i] = lineNo;
cached = 1;
}
}
}
在上面的函数中,我将一个指针传递给要修改的特定iruQueue数组,以及一个集合中的行数和刚刚使用的行数。它搜索iruQueue,找到值为-1的第一个索引(表示该索引未使用),并用行号替换它。我像这样将一个特定的iruQueue传递给这个函数。
cache(&(cache[setIndex].iruQueue), noLines, lineNo);
所以这是我真正有问题的地方。我注意到,它在第一次调用enqueue时工作,但在随后的enqueues/dequeues上不能正常工作。
在enqueues/dequeues之前打印这样的特定队列(NoSets是缓存数组中的集合类型数,NoLines是集合数组中的行数)
int i, j;
for(i = 0; i < NoSets; i++) {
for(j = 0; i < NoLines; j++)
printf("%d, ", cache[i].iruQueue[j])
}
当有四行和一个集合时,产生以下结果:“-1,-1,-1,-1”。在一个行号为0的排队之后,它将生成“0,-1,-1,-1”。正常的运作到此为止。
我很好奇,所以在我的enqueue函数中添加了一些代码,以便在修改前后打印iruQueue数组。
void enqueue(int ** iruQueue, int noLines, int lineNo)
{
int cached = 0;
int i;
//checks the iruQueue array prior to modification
printf("Before: \n");
for(i = 0; i < noLines; i++) {
printf("%d : %d\n", i, iruQueue[i]);
}
for(i = 0; i < noLines; i++) {
if(*iruQueue[i] == -1 && cached == 0) {
*iruQueue[i] = lineNo;
cached = 1;
}
}
//checks the iruQueue array after modification
printf("After: \n");
for(i = 0; i < noLines; i++) {
printf("%d: %d\n", i, iruQueue[i]);
}
}
下面是当我们从未修改的iruQueue数组(意味着所有值都应该是-1)开始,行号是4,行号是0时它将打印的内容。
Before:
0 : -1
1 : 0
2 : -1
3 : 0
After:
0 : 0
1 : 0
2 : -1
3 : 0
似乎被修改的iruQueue已经改变了,每个正确的值之间都有0。如果我将print函数更改为通过noLines*2打印,则模式将继续。那是我的问题。当iruQueue没有传递给enqueue/dequeue函数并且我以同样的方式打印它的内容时,它将正确打印,并且没有包含零的额外索引。为什么这样传递它会改变它,我能做些什么来修复它吗?
铊
我通过将int数组的地址传递给函数(&(cashe[setIndex].iruQueue))来将整数数组(int*iruQueue)传递给函数。在函数外部,它按原样操作,但当传递给函数时,它会创建额外的索引,每个正确的索引之间都有0个值。如何解决这个问题?
如果需要更多的代码/说明,我很乐意提供。另外,如果我做错了这件事(写了太多waaayyyyy之类的东西),请告诉我——虽然我在这个网站上读了很多帮助我解决问题的东西,但我从来没有在这里发帖,所以我只想尽可能彻底。
谢谢!
最佳答案
实际上,这里不需要双指针,这会使事情复杂化。访问时会取消引用,但打印时不会(这是错误的;我想知道为什么它不会崩溃或产生更多的“随机”输出…)。只需将其简化为一个指针:
void enqueue(int * iruQueue, int noLines, int lineNo)
{
int cached = 0;
int i;
for(i = 0; i < noLines; i++) {
if(iruQueue[i] == -1 && cached == 0) {
iruQueue[i] = lineNo;
cached = 1;
}
}
}
void foo()
{
enqueue(cache[setIndex].iruQueue, noLines, lineNo);
}
关于c - 修改作为参数传递的* int [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20306065/