如何处理分配的字符串输入?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理分配的字符串输入?相关的知识,希望对你有一定的参考价值。

我正在编写一个函数,当我在第二个参数中发现问题时,它会连接字符串。这是我的功能的简化版本

struct c_class* _Append_s(void* self, const char* str,const DWord length) // DWord is unsigned int
{
    struct c_class* this = self;

    this->inStr = realloc(this->inStr, length + this->len);
#pragma warning(disable:4996)
    strcpy(this->inStr + this->len, str);  // MSVC does an annoying warnings C4996
#pragma warning(default:4996)
    this->len += length;

    return this;
}

这个函数将struct c_class*作为输入参数(void* self),一个string来追加,它的length以字节为单位并返回结构指针(它是为了进行连续调用)struct c_class本身包含一个char * inStr和string的长度。但事实并非如此。

作为输入_Append_s可以采用常规const stringschar* in = "some text",char数组 - char in[10],但也有一个分配的字符串char* inm = malloc(n)

所以问题是:

1)我可以以某种方式跟踪分配的字符串并在连接时释放它们吗?更好的是没有额外的输入,因为它是一个内部函数,我从类型int和char *的包装器中调用它。

2)也许有一种方法可以将分配的字符串转换为const字符串表达式和之后的空闲内存?

如果第二件事是可能的,那么第一个问题就会变得过时,因为它解决了我需要产生一个完成的字符串并释放内存的问题,struct c_class*占据了

答案

如果你想释放char数组,你只需要在free((char*)str);上面添加return this;但是也许我没理解你。

正如John Humphreys-w00te在这个答案https://stackoverflow.com/a/12204279/6911200指出的那样警告C4996意味着:

函数strcpy被认为是不安全的,因为没有边界检查并且可能导致缓冲区溢出。

因此,正如它在错误描述中所暗示的那样,您可以使用strcpy_s而不是strcpy

strcpy_s( char *strDestination, size_t numberOfElements,
const char *strSource );

以上是关于如何处理分配的字符串输入?的主要内容,如果未能解决你的问题,请参考以下文章

在片段之间切换时如何处理相机?

如何处理片段和活动中的后压

如何处理 ViewModel 中的配置更改

现代虚拟机如何处理内存分配?

如何处理 C 中的堆栈数组分配失败?

如何处理片段中的onClick [重复]