gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:38:08 25 4
gpt4 key购买 nike

有没有更好的方法以不需要清理的方式在 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 返回目标的方式,将缓冲区格式化一个额外的字节以提供空终止。

显然不能在循环中使用它,因为它会一次又一次地在堆栈上分配。

最佳答案

使用 C99 编译器,本地数组可以动态调整大小:

  void demo (const char * original)
{
char copy[strlen (original) + 1];
strcpy (copy, original);

...
}

这与 alloca 的工作方式相同,但它更简洁且(更)可移植。

关于c - 堆栈上的字符串 - c 中没有清理的临时字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31315252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com