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

问题描述 投票:0回答:1

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

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*占据了

c string
1个回答
0
投票

如果你想释放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 );
© www.soinside.com 2019 - 2024. All rights reserved.