c - 正在返回一个本地指针导致未定义的行为

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

最佳答案

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

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

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

和最近的 GCC 编译器(例如 4.8)将发出警告,至少对于您始终应该使用的 -Wall 是这样。关于调用堆栈,请参阅 this answer其中提供了很多有用的链接。

在编写一些 malloc 时,也要编写 free(并尽量避免过于频繁地进行系统调用,因此重新使用 free >-d 尽可能在 malloc 中存储)。另请查看现有 malloc 自由软件实现的源代码。 MUSL libc有一些相当可读的malloc/ ...

关于c - 正在返回一个本地指针导致未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16532983/

相关文章:

bash - unix 按关联的最大值对组进行排序?

macos - "Q"尽管在所有其他程序中都可以使用,但 key 在 MacBook Pro 的终端中不起作用

security - 像这样使用环境变量是否存在任何安全问题?

c - 在一个应用程序中注册回调以在另一个应用程序中检索

java - 将 C 语句转换为 Java (Array[][] != 0)

unix - 在emacs中打开时如何自动解压缩自定义压缩文件?

UNIX 将内容解压到多个文件夹中

汇编中的C变量使用,如何在arm aarch64中选择32位操作数

c - MPFR 程序高精度崩溃

c - 通过 fread() 读取二进制文件