相关疑难解决方法(0)

计算字符串长度的不同方法

一个评论我的一个答案给我留下了有点摸不着头脑.当试图计算将两个字符串连接到一个新的内存块需要多少内存时,据说使用的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 memory string printf strlen

3
推荐指数
1
解决办法
802
查看次数

malloc和递归函数中的自由

我有一些代码给你,希望有人能告诉我,我错了.目前我正在将我的编程难题移植到其他编程语言中,以便获得一些动手.

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)

c recursion pointers

3
推荐指数
2
解决办法
2214
查看次数

标签 统计

c ×2

memory ×1

pointers ×1

printf ×1

recursion ×1

string ×1

strlen ×1