【发布时间】:2015-03-07 21:54:01
【问题描述】:
int *ptr = calloc(10,(sizeof(int)));
int *ptr2 = (ptr);
for (int i = 0; i < 10; ++i) {
int r = rand() % 20000;
*(ptr + i) = r;
printf("[i:%d, v:%d, a:%p]", i, *(ptr + i), ptr+i);
fflush(stdout);
}
printf("\n");
printf("[v:%d, a:%p]", *(ptr2), ptr2);
printf("\n");
*ptr2=5;
printf("[v:%d, a:%p]", *(ptr2), ptr2);
printf("\n");
for (int i = 0; i < 10; ++i) {
printf("[i:%d, v:%d, a:%p]", i, *(ptr + i), ptr+i);
}
printf("\n");
free(ptr2);
free(ptr);
这是输出:
[i:0, v:5933, a:0x600010360][i:1, ...
[v:5933, a:0x600010360]
[v:5, a:0x600010360]
[i:0, v:5, a:0x600010360][i:1, ...
请解释为什么同一个地址有两个不同的值? - 这实际上不会发生..
而且像我一样释放指针也会出错:
* 检测到 glibc * /home/travis/build/batousik/Practical-C2/bin/.libs/lt-practical_trees: double free or corruption (fasttop): 0x0000000000e05010 ***
在实际程序中,我在 int 数组和 Tree 数据类型中有测试数据。我用数组中的一些数据填充树,然后我试图递归地释放树中节点和节点的每个值,但失败了。是不是因为节点中的所有值指针实际上都是一个内存块?然后我应该将数组中的值 memcopy 到新分配的节点值的内存空间中吗?
【问题讨论】:
-
该值不同,因为您每次打印前都明确更改它。
-
@inspired我很抱歉这个问题用 c 熬夜了,inded 代码每次都会改变值
标签: c arrays pointers int dereference