我正在编写一个函数,当我在第二个参数中发现问题时,它将字符串连接起来。 这是我的功能的简化版本
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指针(使其连续)来电)
struct c_class本身包含char * inStr和字符串长度。但是事实并非如此。
作为输入_Append_s可以使用常规const字符串char* in = "some text"
,char数组-char in[10]
,也可以采用分配的字符串char* inm = malloc(n)
。
所以问题是:
1)我可以以某种方式跟踪分配的字符串并在连接时释放它们吗?最好没有其他输入,因为它是一个内部函数,我从int和char *类型的包装器中调用它。
2)也许有一种方法可以将分配的字符串转换为const字符串表达式,然后再释放内存?
如果第二件事可行,则第一个问题会过时,因为它解决了一个问题,我需要产生一个完成的字符串并释放一个内存,struct c_class*
会占用该内存
答案 0 :(得分: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 );