gpt4 book ai didi

c - Malloc 影响随机整数值

转载 作者:太空宇宙 更新时间:2023-11-04 00:49:51 25 4
gpt4 key购买 nike

我正在用 C 编写一个虚拟内存模拟器,在 Linux 上编译,但我得到了一些相当奇怪的东西。它接受一个文件 IO,我将其放入一个 int* plist 中。

我已经打印了这个“plist”数组,结果是0 1001 2002 4003 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,它会。

最佳答案

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

  • tables[i] 越界;
  • plist 包含一个悬挂指针(即它已被释放);
  • plist 还没有初始化;
  • plist 没有您想象的那么大,即 plist[3] 超出范围。

如果看代码还是找不到问题,valgrind是你的 friend 。

关于c - Malloc 影响随机整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22728518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com