一个评论我的一个答案给我留下了有点摸不着头脑.当试图计算将两个字符串连接到一个新的内存块需要多少内存时,据说使用的snprintf是首选strlen,如下所示:
size_t length = snprintf(0, 0, "%s%s", str1, str2);
// preferred over:
size_t length = strlen(str1) + strlen(str2);
Run Code Online (Sandbox Code Playgroud)
我可以在这背后得到一些推理吗?有什么优势,如果有的话,有人会看到一个结果与另一个结果不同吗?
我有一些代码给你,希望有人能告诉我,我错了.目前我正在将我的编程难题移植到其他编程语言中,以便获得一些动手.
C中的代码抽象(更新):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *dummy = "1234567890";
const char* inlet = "_";
void dosomething(int c, char* s){
printf("%s\n", s);
if (c < 10) {
char *ns = malloc(sizeof(char)*11);
strncpy(ns, s, c-1);
strncat(ns, inlet, 1);
strcat(ns, &s[c]);
dosomething(c+1, ns);
//free(ns);
}
}
void main() {
for(int i = 0; i < 100; i++) {
char *s = malloc(sizeof(char)*11);
strcpy(s, dummy);
dosomething(1, s);
free(s);
}
}
Run Code Online (Sandbox Code Playgroud)
代码运行得很好,直到我取消注释dosomething()方法中的free()调用.这就是我不理解的.正如我所看到的,释放内存绝对没有问题,因为在从递归调用返回后不再使用它,但是programm输出告诉了不同的东西.
没有免费的输出符合预期:
...
1_34567890
1_34567890
...
Run Code Online (Sandbox Code Playgroud)
使用第二个空闲时,只有一个结果,而程序停止时:
*** Error in …Run Code Online (Sandbox Code Playgroud)