Malloc影响随机整数值

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,它确实如此.

NPE*_*NPE 6

有几种可能性,包括(但不限于):

  • tables[i] 超出范围;
  • plist 包含一个悬空指针(即它已被解除分配);
  • plist 尚未初始化;
  • plist没有你想象的那么大,即plist[3]超出范围.

如果您无法通过查看代码来解决问题,那么valgrind您的朋友是谁?