以示例代码*:
为例char *string = (char*)malloc(sizeof(char));
strcat_s(string, strlen(string) + 10 + 1, "characters");
上面的代码编译并运行,使我相信内存重新分配正在发生。但是,当更大的规模应用时(也递归)时,我会在随机位置收到内存错误(每次运行程序时都不同)。
strcat_s()可以超过边界吗?因此,需要realloc()确保正确分配内存吗?
注意:可能是错误是无关的,尽管它们在应用示例中应用代码后偶然出现。
*我最初仅分配一个字节的原因是,我正在使用动态大小,因此string
的大小会更改,但数量未知。
上面的代码编译并运行,使我相信记忆 正在进行重新分配。
仅仅是因为该程序的行为似乎是您所期望的,并不意味着它是正确的,甚至从C的角度来定义了其行为。
但是,当更大规模应用时 (也递归),我在随机位置收到内存错误 (每次运行程序时都不同)。
strcat_s()
可以超过边界吗?
是。
是
realloc()
因此 确保正确分配内存需要吗?
no。
strcat_s()
和strcat()
均未执行任何重新分配。他们没有指定这样做,而这样做是不安全的。
您会收到错误,因为您使用该函数错误(即使您 获取错误,也是如此)。您有责任确保第二个论点不会超过第一个参数指向的数组的大小,但是您公然忽略了该责任。我认为您只是对strcat_s()
应该做什么以及其第二个参数的含义严重误解。
strcat_s()
提供的主要内容,但strcat()
没有检查指定的数组边界是否由于第二个字符串长于可以容纳的时间而被覆盖。这使您能够在执行串联之前检查第二个字符串的长度,这是有利的,因为strcat_s()
可以以非常低的成本进行操作,因为无论如何它都必须扫描该字符串。strcat_s()
比任何其他C操作或功能都没有能力独立确定第一个参数指向的数组多长时间。它依靠您告诉它。
如果您需要适应数组尺寸的动态调整,那么这就是您的责任,就像跟踪分配的当前大小一样。
在这里您恰好分配1个char
char *string = (char*)malloc(sizeof(char));
所以string
可以容纳的唯一字符串是""
(零长度字符串)
然后,您尝试将字符串"characters"
附加到string
上,该字符串无法容纳""
以外的字符串,并且未初始化。此外,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("%sn", string); // will display "Hello characters".