【发布时间】:2014-05-08 20:10:50
【问题描述】:
我正在用 C 语言编写一个虚拟内存模拟器,在 linux 上编译,我得到了一些相当奇怪的东西。它接受一个文件 IO,我将它放入一个 int* plist 中。
我打印了这个“plist”数组,结果是 0 100 1 200 2 400 3 300 等等
问题是它似乎 malloc 或某些东西正在随机将 plist[3] 更改为 0。看起来不应该那样,但我在每一行代码中都放置了一个 print 语句来打印 plist [3],和
tables[i].valid = (char*) xmalloc(num_pages * sizeof(char));
是它改变的地方。 plist[3] = 行前 300,行后 0。它只在 i = 2 时才这样做。循环的前 3 轮运行良好,在第 3 轮,它改变了第 4 轮的值。我不知道为什么,malloc 会改变一个值没有什么意义一个完全不相关的数组 - 我是否可能已经超出了一些空间限制,即使我基本上将堆用于所有内容?如果我这样做了,它只会改变随机数组中的值吗?
for(i = 0; i < 4; i++){
num_pages = plist[i] / P1;
tables[i].page_num = (char**) xmalloc(num_pages * sizeof(char*));
tables[i].valid = (char*) xmalloc(num_pages * sizeof(char));
//initialize page numbers and valid bits
for(j = 0; j < 10; j++){
tables[i].page_num[j] = (char*) xmalloc(16*sizeof(char));
tmp = itoa(i, tmp);
strcat(tables[i].page_num[j], tmp);
strcat(tables[i].page_num[j], "p");
tmp = itoa(j, tmp);
strcat(tables[i].page_num[j], tmp);
tables[i].valid[j] = 0;
}
}
这是表的结构:
typedef struct s_page_table
{
char** page_num;
char* valid;
} t_page_table;
这就是 xmalloc(它只是一个让事情变得更简单的包装器):
void* xmalloc(int s)
{
void* p;
p = malloc(s);
if (p == NULL)
{
printf("Virtual Memory Exhausted");
exit(1);
}
return p;
}
编辑:如果我取出引用表[i].valid 的两行,则问题不存在。 plist[3] 保持不变。 num_pages 总是 >= 10。我将 j 设置为 0 到 10 只是为了减少输出以进行调试。
编辑 2:如果我将 valid 从 char* 更改为 int* 它不起作用。如果我将其更改为 int,则可以。
【问题讨论】:
-
我们是否应该猜测
tmp是什么,它来自哪里,以及为什么它在itoa中被使用,而代码中没有其他地方出现? -
num_pages是否小于 10? IE。j循环不应该使用num_pages作为绑定而不是10? -
我试图猜测
P1可能是什么。 @user3475234 如果你发布一个完整的可编译程序,人们解决这些谜题会容易得多。 -
检查您的所有
strcats 是否不会溢出您分配的内存量。我会考虑用snprintf(tables[i].page_num[j], 16, "%dp%d", i, j);替换整个块 -
还要检查
num_pages >= 10