加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:44:53 所属栏目:百科 来源:网络整理
导读:我在声明中有疑问 p = my_malloc(4); my_malloc有一个名为p的本地指针,当函数返回时,指针的地址将被释放.那么main中的int * p怎么能保存函数返回的地址呢?当函数返回时,其使用的地址可能会或可能不会被其他函数或进程使用.那么下面的程序是一个未定义的行为
我在声明中有疑问

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进行编码(并尽量避免过于频繁地进行系统调用,因此在可能的情况下重新使用malloc中的free-d内存).另请参阅现有malloc自由软件实现的源代码.
MUSL libc有一些相当可读的malloc/ ……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读