我正在阅读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/