C:malloc和free的堆栈实现

C:malloc和free的堆栈实现,c,arrays,pointers,logical-operators,comparison-operators,C,Arrays,Pointers,Logical Operators,Comparison Operators,我正在阅读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

我正在阅读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;
}
#包括
#定义ALLOCSIZE 10000
静态字符allocbuf[ALLOCSIZE];
静态字符*allocp=allocbuf;
字符*alloc(整数n)
{
如果(allocbuf+ALLOCSIZE-allocp>=n)
{   
allocp+=n;
返回(allocp-n);
}   
其他的
返回0;
}
自由空间(字符*p)
{
如果(p>=allocbuf&&p
新分配

allocp 0x601080

char*a=alloc(10)

allocp 0x60108a

char*b=alloc(5)

allocp 0x60108f

afree(b)之后

allocp 0x60108f

afree(a)之后

allocp 0x60108f


allocp
仍然指向
0x60108f
。为什么不根据代码进行更新?

在代码中

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

a = "ayushnair";
a = "ayushnair";
您正在将字符串文本的基址存储到
a
中。这样,您实际上通过调用
alloc()
覆盖了返回的指针

这不是你想要的。您可能需要使用将字符串文字复制到返回的指针中

也就是说,根据当前代码,稍后通过调用

afree(b);
afree(a);
您正在调用,因为您正在尝试合并不指向同一对象的指针

引用
C11
,第§6.5.8章,关系运算符

比较两个指针时,结果取决于指针中的相对位置 指向的对象的地址空间。如果两个指向对象类型的指针都指向 同一对象,或两者都指向同一数组对象的最后一个元素,则 比较平等。如果指向的对象是同一聚合对象的成员, 指向后来声明的结构成员的指针比指向成员的指针大 在结构的前面声明,并指向具有较大下标的数组元素 值比指向具有较低下标值的相同数组元素的指针大。指向同一联合对象成员的所有指针比较相等。如果 表达式P指向数组对象的元素,表达式Q指向 同一数组对象的最后一个元素,指针表达式Q+1大于 P.在所有其他情况下,行为未定义。


在你的代码中,说

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

a = "ayushnair";
a = "ayushnair";
您正在将字符串文本的基址存储到
a
中。这样,您实际上通过调用
alloc()
覆盖了返回的指针

这不是你想要的。您可能需要使用将字符串文字复制到返回的指针中

也就是说,根据当前代码,稍后通过调用

afree(b);
afree(a);
您正在调用,因为您正在尝试合并不指向同一对象的指针

引用
C11
,第§6.5.8章,关系运算符

比较两个指针时,结果取决于指针中的相对位置 指向的对象的地址空间。如果两个指向对象类型的指针都指向 同一对象,或两者都指向同一数组对象的最后一个元素,则 比较平等。如果指向的对象是同一聚合对象的成员, 指向后来声明的结构成员的指针比指向成员的指针大 在结构的前面声明,并指向具有较大下标的数组元素 值比指向具有较低下标值的相同数组元素的指针大。指向同一联合对象成员的所有指针比较相等。如果 表达式P指向数组对象的元素,表达式Q指向 同一数组对象的最后一个元素,指针表达式Q+1大于 P.在所有其他情况下,行为未定义。

它不更新指针(在afee上),因为mememory分配器的这种算法是渐进的,并且没有先前分配的内存部分的“内存”。因此,只返回指向未使用内存的指针。分配ALLOCSIZE后,将无法分配更多内存。大多数内存分配器都会对消耗的内存进行一些假设。

它不会更新指针(在afee上),因为内存分配器的这种算法是渐进式的,并且没有先前分配的内存部分的“内存”。因此,只返回指向未使用内存的指针。分配ALLOCSIZE后,将无法分配更多内存。大多数内存分配器都会对消耗的内存进行一些假设

char* a = alloc(10);
这将从
allocbuf
中“分配”内存,并将指向该内存的指针分配给
a

a = "ayushnair";
这将为
指定一个不同的指针,指向字符串literal
“ayushnair”
,该字符串不在
allocbuf
中,而是完全在内存中的其他地方

从现在开始,您的程序变得越来越混乱(特别是因为您在
b
上犯了类似的错误)。调用
afree(a)
没有意义,因为
a
不再是p