
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/ ……
以上是内存溢出为你收集整理的返回本地指针导致未定义的行为全部内容,希望文章能够帮你解决返回本地指针导致未定义的行为所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)