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 中吗?
因为你两次释放同一个指针。您在下一行
中指向由calloc()
1编辑的地址return
ptr = calloc(10, sizeof(int));
然后让 ptr2
指向与
相同的位置
ptr2 = ptr;
所以释放 ptr
或 ptr2
实际上释放的是同一个指针。
没有任何迹象表明给定地址的值实际上有两个值,只是
*ptr2 = 5;
改变了ptr
或ptr2
指向的第一个元素的值,实际上你总是在打印前覆盖那个地址的值。
如果您在代码中有问题的 free()
调用之前执行此操作
fprintf(stderr, "value of ptr : %p\n", ptr);
fprintf(stderr, "value of ptr2: %p\n", ptr2);
将打印相同的值,因此您实际上需要 对 free()
的单个 调用传递任何 ptr
或 ptr2
但是一个通过后不是另一个。
1如果要在 calloc()
之后显式初始化数据,则不需要使用 calloc()
称呼。而且,你应该检查 calloc()
/malloc()
没有 return NULL
.
int *ptr2 = (ptr);
这只是复制指针的值。在这一行之后,ptr
和 ptr2
都指向相同的已分配内存。那么,
free(ptr2);
free(ptr);
您正在释放相同的分配两次。
我不太确定您的代码应该做什么。您有两个循环都在覆盖同一块内存。由于某种原因,您还向该块中的第一个 int
写入 5。
同一个地址的两个值是因为这个
*ptr2 = 5
glibc 错误是因为双重 free(ptr)
和 free(ptr2)
.
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 中吗?
因为你两次释放同一个指针。您在下一行
中指向由calloc()
1编辑的地址returnptr = calloc(10, sizeof(int));
然后让
相同的位置ptr2
指向与ptr2 = ptr;
所以释放
ptr
或ptr2
实际上释放的是同一个指针。没有任何迹象表明给定地址的值实际上有两个值,只是
*ptr2 = 5;
改变了
ptr
或ptr2
指向的第一个元素的值,实际上你总是在打印前覆盖那个地址的值。
如果您在代码中有问题的 free()
调用之前执行此操作
fprintf(stderr, "value of ptr : %p\n", ptr);
fprintf(stderr, "value of ptr2: %p\n", ptr2);
将打印相同的值,因此您实际上需要 对 free()
的单个 调用传递任何 ptr
或 ptr2
但是一个通过后不是另一个。
1如果要在 calloc()
之后显式初始化数据,则不需要使用 calloc()
称呼。而且,你应该检查 calloc()
/malloc()
没有 return NULL
.
int *ptr2 = (ptr);
这只是复制指针的值。在这一行之后,ptr
和 ptr2
都指向相同的已分配内存。那么,
free(ptr2);
free(ptr);
您正在释放相同的分配两次。
我不太确定您的代码应该做什么。您有两个循环都在覆盖同一块内存。由于某种原因,您还向该块中的第一个 int
写入 5。
同一个地址的两个值是因为这个
*ptr2 = 5
glibc 错误是因为双重 free(ptr)
和 free(ptr2)
.