堆栈上的字符串 – c中没有清理的临时字符串

有没有更好的方法在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的工作方式相同,但它更干净,更便携.

点赞