use*_*234 1 c memory arrays malloc
我正在用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));
Run Code Online (Sandbox Code Playgroud)
是它改变的地方.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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是表的结构:
typedef struct s_page_table
{
char** page_num;
char* valid;
} t_page_table;
Run Code Online (Sandbox Code Playgroud)
这是xmalloc(它只是一个让它更容易的包装器):
void* xmalloc(int s)
{
void* p;
p = malloc(s);
if (p == NULL)
{
printf("Virtual Memory Exhausted");
exit(1);
}
return p;
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果我取出两个引用表[i] .valid的行,则问题不存在.plist [3]保持不变.num_pages总是> = 10.我将j设置为0到10只是为了减少输出以进行调试.
编辑2:如果我将char*中的有效值更改为int*则不起作用.如果我把它改成int,它确实如此.
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |