采用示例代码*:
char *string = (char*)malloc(sizeof(char));
strcat_s(string, strlen(string) + 10 + 1, "characters");
上面的代码编译并运行,让我相信内存重新分配正在发生。但是,当以更大的比例应用时(也递归地),我在随机位置接收内存错误(每次运行程序时都不同)。
strcat_s()可能超出界限吗?因此需要realloc()来确保正确分配内存吗?
注意:错误可能是无关的,尽管在应用示例中的代码后,它们巧合地出现了。
*我最初只分配了一个字节的原因是,我在使用动态大小进行上下文操作,因此string
的大小会发生变化,但数量会有所不同。
答案 0 :(得分:2)
上面的代码编译并运行,让我相信内存 重新分配正在进行中。
仅仅因为程序似乎表现得像你期望的那样并不意味着它是正确的,甚至从C的角度来看它的行为是完全定义的。
然而,当更大规模应用时 (递归地),我在随机的地方收到内存错误 (每次运行程序时都不同。)
strcat_s()
可能超出界限吗?
是
因此
realloc()
是否需要确保正确分配内存?
没有
strcat_s()
和strcat()
都不执行任何重新分配。他们没有被指定这样做,他们这样做是不安全的。
您收到错误是因为您错误地使用了该功能(即使您没有获取错误)。您有责任确保第二个参数不超过第一个参数所指向的数组的大小,但是您公然无视该责任。我认为你只是对strcat_s()
应该做什么以及它的第二个参数意味着什么产生了严重的误解。
strcat_s()
但strcat()
提供的主要内容不是检查指定的数组边界是否因为第二个字符串长于can而超出被安置。这使您无需在执行连接之前检查第二个字符串的长度,这是有利的,因为strcat_s()
可以以非常低的成本自行完成,因为它必须扫描该字符串。 strcat_s()
没有比任何其他C操作或函数更多的能力来独立地确定第一个参数指向的数组的长度。它依靠你来告诉它。
如果您需要适应数组大小的动态调整,那么这就是您的责任,跟踪当前的分配大小也是如此。
答案 1 :(得分:1)
这里只分配1个字符
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("%s\n", string); // will display "Hello characters".