C:malloc和free的堆栈实现
我正在阅读K&R指针第5.4节,其中完成了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
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