C具有不同指针的相同地址?

C same address with different pointers?

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:双重释放或损坏(fasttop):0x0000000000e05010 ***

在实际程序中我有int数组和Tree数据类型的测试数据。我用数组中的一些数据填充树,然后我试图以递归方式释放树中节点和节点的每个值,但失败了。是因为节点中所有的值指针其实都是一个内存块吗?然后我应该为节点值做一些事情,比如将数组中的值 memcopy 到新分配的内存 space 中吗?

  1. 因为你两次释放同一个指针。您在下一行

    中指向由calloc()1编辑的地址return
    ptr = calloc(10, sizeof(int));
    

    然后让 ptr2 指向与

    相同的位置
    ptr2 = ptr;
    

    所以释放 ptrptr2 实际上释放的是同一个指针。

  2. 没有任何迹象表明给定地址的值实际上有两个值,只是

    *ptr2 = 5;
    

    改变了ptrptr2指向的第一个元素的值,实际上你总是在打印前覆盖那个地址的值。

如果您在代码中有问题的 free() 调用之前执行此操作

fprintf(stderr, "value of ptr : %p\n", ptr);
fprintf(stderr, "value of ptr2: %p\n", ptr2);

将打印相同的值,因此您实际上需要 free() 的单个 调用传递任何 ptrptr2 但是一个通过后不是另一个。


1如果要在 calloc() 之后显式初始化数据,则不需要使用 calloc()称呼。而且,你应该检查 calloc()/malloc() 没有 return NULL.

int *ptr2 = (ptr);

这只是复制指针的。在这一行之后,ptrptr2 都指向相同的已分配内存。那么,

free(ptr2);
free(ptr);

您正在释放相同的分配两次

我不太确定您的代码应该做什么。您有两个循环都在覆盖同一块内存。由于某种原因,您还向该块中的第一个 int 写入 5。

同一个地址的两个值是因为这个

*ptr2 = 5

glibc 错误是因为双重 free(ptr)free(ptr2).