返回本地指针导致未定义的行为

时间:2013-05-13 23:53:41

标签: c unix

我在声明中有疑问

  

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);
}

2 个答案:

答案 0 :(得分:5)

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

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

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

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

对某些malloc进行编码时,也请对free进行编码(并尽量避免过于频繁地进行系统调用,因此请重新使用free内存malloc内存} 如果可能)。另请参阅现有malloc自由软件实现的源代码。 MUSL libc有一些非常易读的malloc/ ...

答案 1 :(得分:2)

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