3

我对声明有疑问

p = my_malloc(4);

my_malloc 有一个名为 p 的本地指针,当函数返回该指针的地址时将被释放。那么 main 中的 int* p 是如何保存函数返回的地址的呢?当一个函数返回时,它使用的地址可能会或可能不会被其他函数或进程使用。那么下面的程序是未定义的行为吗?

#include<stdio.h>
#include<unistd.h>

void* my_malloc(size_t size){
 void *p;
 p = sbrk(0); 
 p = sbrk(size); // This will give the previous address
 //p = sbrk(0); // This will give the current address
 if(p != (void *)-1){
   printf("\n address of p : 0x%x \n",(unsigned int)p);
 }
 else{
  printf("\n Unable to allocate memory! \n");
  return NULL;
 }
 return p;
}

int main(){
 int* p;
 p = my_malloc(4);
 printf("\n address of p : 0x%x \n",(unsigned int)p);
}
4

2 回答 2

5

您的代码看起来不错,请注意sbrk(2)几乎已过时(并且线程不友好),大多数 malloc 实现使用mmap(2)代替。

未定义的行为是返回局部变量的地址,例如

void* topofstack() {
   char c;
   return &c;
}

并且最近的 GCC 编译器(例如 4.8)会发出警告,至少-Wall您应该始终使用它。关于调用堆栈,请参阅this answer,它提供了很多有用的链接。

在编写 somemalloc时,也要编写 the free(并尽量避免过于频繁地进行系统调用,因此在可能的情况下重新使用free-d 内存malloc)。还可以查看现有 malloc 自由软件实现的源代码。MUSL libc有一些可读性很强的malloc/ ...

于 2013-05-13T23:58:39.167 回答
2

my_malloc 中分配的堆栈本地存储是 p(存储在 p 中的地址)。您不能返回 p ( &p) 的地址并在以后使用它。但是,由 p 指向的已分配空间仍将被分配。该地址在 p 被销毁之前被复制。这与从函数返回整数值没有什么不同。

于 2013-05-13T23:58:58.427 回答