按C中的值返回可变宽度数据

Kal*_*cic 0 c assembly memory-management

我正在寻找一种在C中编写函数的方法,它按值返回一个字节字符串.我知道这通常是通过从堆中分配,或通过使调用者传递指向某个缓冲区的指针来解决的.但是,在我的情况下,由于性能原因,函数不能执行任何堆分配(因此没有malloc,只是alloca),并且字符串长度由函数确定,因此调用者无法知道要分配多少空间对于它,也没有定义的最大长度.我也不能将功能分成两半; 一个确定长度,一个生成字符串.

简而言之,被调用者必须是确定长度的人,在堆栈上分配字符串并填充它.当函数返回时,调用者可能需要做一些花哨的东西才能安全地存储字符串,但同样,它必须存储在堆栈中,而不需要多次调用函数.

我知道这不是好习惯,这只会用在计算机生成的C代码中.我不认为这可以在"安全"标准C中完成,因为在堆栈上分配的所有内容都是作用域并在作用域出口处死亡.但实际上,这些值仍然存在于堆栈中(至少在它们被覆盖之前),即使C标准表明读取它们是未定义的行为.有人知道在x86/x86_64上做这个的好方法吗?

Ser*_*eyA 6

这在C中是不可解的.一旦函数退出,所有堆栈分配的变量都被删除.你可能想要alloca()从你的函数返回一个指向-provided地址的指针,但这会让你陷入未定义的行为,你将成为一个公平的优化游戏.