2013-05-13 23 views
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); 
} 
+3

当您调用方法时为局部变量分配的内存在从方法返回时释放,并且在返回后使用指向该内存的指针是未定义的行为。如果您在堆上动态分配并返回一个指向该THAT的指针,如果您这样做没问题。 – Patashu 2013-05-13 23:58:01

+0

感谢basile和perreal。我现在明白了为什么它不是一个未定义的行为 – Angus 2013-05-14 00:01:22

回答

5

您的代码看上去正常,提防sbrk(2)几乎是过时的(和线程不友好的),大部分的malloc实现使用mmap(2)代替。

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

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

和最近的GCC编译(如4.8)将作出警告,至少-Wall,你总是应该使用。关于呼叫堆栈,请参阅this answer,它提供了很多有用的链接。

当编码一些malloc,确实也编写了free(并尽量避免一个系统调用过于频繁,所以在malloc可能在重新使用free -d内存)。看看现有的malloc免费软件实现的源代码。 MUSL libc有一些相当可读的malloc/ ...

+0

也会考虑现有的malloc免费s/w实现。谢谢。 – Angus 2013-05-14 00:03:13

2

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

相关问题