C语言中的Wrap alloca函数
是否可以将C函数C语言中的Wrap alloca函数,c,memory,gnu,alloca,C,Memory,Gnu,Alloca,是否可以将C函数alloca包装为“另一个”?(当然只有宏) 比如: #定义我的分配(大小)\ ({ \ void*ret=alloca(尺寸)\ my_功能(ret)\ ret;}) 我不太确定,扩展名6.1语句和表达式中的声明是否创建了一个新的堆栈框架?(因为括号是卷曲的,所以看起来有点像) 编辑: 它对它做了一些测试: #定义printStackFrameAddr(_fnc)\ printf(“%-20s:%p\n”,fnc,
alloca
包装为“另一个”?(当然只有宏)
比如:
#定义我的分配(大小)\
({ \
void*ret=alloca(尺寸)\
my_功能(ret)\
ret;})
我不太确定,扩展名6.1语句和表达式中的声明是否创建了一个新的堆栈框架?(因为括号是卷曲的,所以看起来有点像)
编辑:
它对它做了一些测试:
#定义printStackFrameAddr(_fnc)\
printf(“%-20s:%p\n”,fnc,内置帧地址(0))
void\u my\u init(void*mem)
{
}
void*notSafeAlloca(大小\数量)
{
void*mem;
printStackFrameAddr(“notSafeAlloca”);
mem=alloca(num);
_我的名字(mem);
返回mem;
}
#定义safeAlloca(_num)\
({ \
void*ret=alloca(_num)\
_我的初始(ret)\
printStackFrameAddr(“safeAlloca”)\
ret;})
int main(int argc,const char*argv[]
{
printStackFrameAddr(“主”);
{/*我怀疑你能,但更重要的是,你为什么要这么做?
这是一个严重的错误
您将在堆栈上分配某些内容,以便在堆栈上销毁它,就像您返回它的指令一样!在您有机会使用它之前,它几乎肯定会在堆栈上被覆盖。我的问题有解决方案:)
void*\u my\u alloca(void*内存)
{
//初始化内存和东西
返回存储器;
}
#定义我的alloca(\u大小)\u我的alloca(alloca(\u大小))
int main(int argc,常量字符**argv)
{
int*array=my_alloca(sizeof(*array)*4);
}
我知道这一点,我的问题是“表达式中的6.1语句和定义”是否创建了一个新的堆栈框架。如果不是,那就很好了。大括号的作用与您在main()中测试的堆栈框架不同
是不确定的;可能是因为未使用“数组”而优化了它。您至少应该打印地址(printf(“%p\n”,数组);
)看看这是否改变了什么。@JonathanLeffler没有,仍然是相同的堆栈帧地址。@d3l:这不是那么简单。为了复合文本、自动变量等的目的。块的结尾确实会结束这些对象的生存期。alloca
非常特殊,因为它创建的对象的生存期与调用f关联函数而不是块。要问的问题不是大括号是否“创建堆栈帧”,而是“由alloca
创建的对象的生存期是多少?”