strcat_s()是否需要使用realloc()?

strcat_s()是否需要使用realloc()?,c,memory,realloc,strcat-s,C,Memory,Realloc,Strcat S,以代码*为例: char *string = (char*)malloc(sizeof(char)); strcat_s(string, strlen(string) + 10 + 1, "characters"); 上面的代码编译并运行,使我相信内存重新分配正在发生。然而,当在更大范围内应用时(也以递归方式),我会在随机位置接收内存错误(每次程序运行时都不同) strcat_s()是否会超出边界?因此,是否需要realloc()来确保正确分配内存? 注意:这些错误可能是不相关的,尽管它们是在

以代码*为例:

char *string = (char*)malloc(sizeof(char));
strcat_s(string, strlen(string) + 10 + 1, "characters");

上面的代码编译并运行,使我相信内存重新分配正在发生。然而,当在更大范围内应用时(也以递归方式),我会在随机位置接收内存错误(每次程序运行时都不同)

strcat_s()是否会超出边界?因此,是否需要realloc()来确保正确分配内存?

注意:这些错误可能是不相关的,尽管它们是在应用示例代码后偶然出现的


*我最初只分配了一个字节的原因是,在上下文中,我使用的是动态大小,因此
字符串的大小将发生变化,但变化量未知。

这里您只分配了一个字符

 char *string = (char*)malloc(sizeof(char));
因此,
字符串
可以容纳的唯一字符串是
(长度为零的字符串)

然后尝试将字符串
“characters”
附加到
字符串
,该字符串不能容纳除
以外的字符串,且未初始化。此外,
strlen(string)
的结果将不确定,因为同样,
string
未初始化

 strcat_s(string, strlen(string) + 10 + 1, "characters");
你可能想要这个:

char *string = (char*)malloc(sizeof(char) * 100);   // allocate 100 bytes
strcpy(string, "Hello ");
strcat_s(string, 100, "characters");

printf("%s\n", string);  // will display "Hello characters".

上面的代码编译并运行,使我相信内存 重新分配正在发生

仅仅因为程序看起来像您期望的那样,并不意味着它是正确的,甚至不意味着它的行为是从C的角度定义的

然而,当在更大范围内应用时 (也递归地)我在随机位置接收内存错误 (每次运行程序时都不同)

strcat_s()
是否会超出边界

因此是
realloc()
是否需要确保正确分配内存

没有

无论是
strcat_s()
还是
strcat()
都不会执行任何重新分配。他们没有被指定这样做,这样做是不安全的

您收到错误是因为您不正确地使用了该函数(即使您没有收到错误)。您有责任确保第二个参数不超过第一个参数所指向的数组的大小,但您公然无视这一责任。我想您只是对strcat_s()应该做什么以及它的第二个参数的含义有一个严重的误解

strcat\s()
提供但
strcat()
没有提供的主要功能是检查指定的数组边界是否由于第二个字符串的长度超过了可以容纳的长度而溢出。这使您无需在执行缩聚之前检查第二个字符串的长度,这是有利的,因为
strcat_s()
本身可以以非常低的成本完成这项工作,因为它无论如何都必须扫描该字符串
strcat_s()
不比任何其他C操作或函数更能独立确定第一个参数指向的数组的长度。这要看你怎么说了


如果您需要适应阵列大小的动态调整,那么这就是您的责任,跟踪当前的大小。< /p>检查:如果目标数组对于Src和DEST和终止空字符的内容都不够大,则行为不明确。我不建议在C++中使用<代码> Malc C <代码> > <代码> StLREN < /C> >或<代码> StrutCys。有更好的工具。@Fredrarson非常好-我考虑过使用std::string,但感觉有点像作弊。但是考虑到大规模手动内存管理的艰巨性,我想我可能不得不这么做。使用正确的工具来完成这项工作并不是欺骗。“让我相信内存正在重新分配”——没有标准的str***函数分配内存。我总是想指出
sizeof(char)根据定义,
是1,所以你也可以使用
malloc(100)
@fredrarson完全正确,但是如果我写了
malloc(100)
,其他人肯定会评论我宁愿写
sizeof(char)*100
来强调我们正在分配char。我会是其中之一:)更喜欢
sizeof(char)*100
到刚好
100
。实际上,我更喜欢
calloc(100,sizeof(char))