我正在阅读K&R指针第5.4节,其中完成了malloc()free()的堆栈实现。我使用gdb调试代码,alloc()部分按预期工作。但是对于afree()部分,指针仍然指向与以前相同的位置。代码如下:

#include <stdio.h>
#define ALLOCSIZE 10000

static char allocbuf[ALLOCSIZE];
static char* allocp = allocbuf;

char* alloc(int n)
{
    if(allocbuf + ALLOCSIZE - allocp >= n)
    {
        allocp += n;
        return (allocp - n);
    }
    else
        return 0;
}


void afree(char* p)
{
    if(p >= allocbuf && p < allocbuf + ALLOCSIZE)
        allocp = p;
}


int main()
{
    char* a = alloc(10);
    a = "ayushnair";
    char*b = alloc(5);
    b = "snea";
    printf("%p    %p\n", a, b);
    afree(b);
    afree(a);
    printf("%p    %p\n", a, b);
    return 0;
}

新分配
分配0x601080
char* a = alloc(10);之后
分配0x60108a
char* b = alloc(5);之后
分配0x60108f
afree(b);之后
分配0x60108f
afree(a);之后
分配0x60108f
allocp仍然指向0x60108f。为什么不按照代码更新?

最佳答案

在你的代码中,通过说

a = "ayushnair";

您没有将"ayushnair"存储到a指向的内存中"ayushnair"是一个字符串文本
a = "ayushnair";

您正在将字符串文本的基址存储到a中。这样,您实际上是通过调用alloc()覆盖返回的指针。
这不是你想要的。可能需要使用strcpy()将字符串文本复制到返回的指针中。
也就是说,根据当前代码,稍后通过调用
afree(b);
afree(a);

您调用undefined behavior是因为您试图使用不指向同一对象的指针。
引用C11,第6.5.8章,关系运算符
当比较两个指针时,结果取决于
指向的对象的地址空间。如果指向对象类型的两个指针都指向
同一个对象,或者都指向同一数组对象的最后一个元素的前面
比较相等。如果指向的对象是同一聚合对象的成员,
指向稍后声明的结构成员的指针比指向成员的指针大
在结构的前面声明,并指向下标较大的数组元素
值将大于指针的值与下标值较低的同一数组的元素进行比较。指向同一联合对象成员的所有指针比较相等。如果
表达式P指向数组对象的元素,表达式Q指向
同一数组对象的最后一个元素,指针表达式Q+1比较大于
在所有其他情况下,行为是不确定的。

关于c - C:malloc和免费的堆栈实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35273296/

10-09 06:20