Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的Wrap alloca函数_C_Memory_Gnu_Alloca - Fatal编程技术网

C语言中的Wrap alloca函数

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,

是否可以将C函数
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
创建的对象的生存期是多少?”