有没有更好的方法在C中以不需要清理的方式临时分配未知长度的字符串?
我目前使用以下,它使用alloca / _alloca或插入编译器喜欢的名称用于此功能
// OLD
// #define stackdup(s) \
// memcpy(memset(_alloca(strlen(s) + 1), 0, strlen(s) + 1), s, strlen(s))
#define stackdup(s) strcpy(_alloca(strlen(s) + 1), s) // refined per comments
// stackndup and stackmiddup can't use strcpy because they need memset 0 ...
#define stackndup(s,n) \
memcpy(memset(_alloca(strlen(s) + 1), 0, strlen(s) + 1), \
s, n > strlen(s) ? strlen(s) : n )
#define stackmiddup(s,pos,n) \
memcpy(memset(_alloca(strlen(&s[pos]) + 1), 0, strlen(&s[pos]) + 1), \
&s[pos], n > strlen(&s[pos]) ? strlen(&s[pos])) )
int main ()
{
const char *address = "123 Main Street";
const char *copy_address = stackdup (address); // "123 Main Street"
const char *address_123 = stackndup (address, 8); // "123 Main"
const char *address_123x = stackndup (address, 55); // "123 Main Street"
const char *address_main = stackmiddup (address, 4, 4); // "Main"
...
}
利用memcpy和memset如何返回dest,将缓冲区格式化一个额外字节以提供空终止.
不能在循环中使用它,因为它会一次又一次地在堆栈上分配.
最佳答案 使用C99编译器,可以动态调整本地数组的大小:
void demo (const char * original)
{
char copy[strlen (original) + 1];
strcpy (copy, original);
...
}
这与alloca的工作方式相同,但它更干净,更便携.