【问题标题】:Char concatenation and memory reallocation字符连接和内存重新分配
【发布时间】:2013-11-29 21:23:45
【问题描述】:

我正在尝试将单个数字连接到一个字符串:

include <stdio.h>
include <stdlib.h>
include <string.h>

int main() {

  char *test="";
  int i;

  for (i = 0; i < 10; i++) 
    char *ic;
    ic = malloc(2);
    sprintf(ic, "%d", i);

    // printf("%d\n", strlen(test));

    if (strlen(test) == 0) 
      test = malloc(strlen(ic));
      strcpy(test, ic);
    } else {
      realloc(test, strlen(test) + strlen(ic));
      strcat(test, ic);
    }

  }
  printf("%s\n", test);
  // printf("%c\n", test);
  free(test);
  test = NULL;
  return 0;
}

我的目标是让最终的结果printf ("%s", test) 成为0123456789

【问题讨论】:

  • ic=malloc(2); - 为什么?为什么不char ic[2]?或者为什么不简单地使用'0' + &lt;digit&gt; 来获取数字的字符表示?
  • 可能是因为这是一个学习练习。
  • 没错,感谢您抽出宝贵时间

标签: c concatenation base


【解决方案1】:

请记住,字符串以空字符结尾。为字符串分配内存时,必须为 null 添加一个额外的字节。因此,您需要为每个 malloc()realloc() 调用添加 1。例如:

test = malloc(strlen(ic) + 1);

还要记住,realloc() 可以将变量“移动”到内存中的新位置。它可能需要这样做才能找到足够的连续未分配空间。如果它无法分配你请求的内存,它也可以返回NULL,所以你应该这样调用它:

char *new_mem = realloc(test, strlen(test) + strlen(ic) + 1);
if (new_mem == NULL) {
  // Not enough memory; exit with an error message.
} else {
  test = new_mem;
}

【讨论】:

  • 非常感谢您快速而清晰的解释。感谢您抽出宝贵的时间,我希望有一天能够自学。
【解决方案2】:

几个问题:

  1. char *test=""; - 你将 test 指向一个常量 C 字符串。你不写它,但它很危险并且会在 C++ 中编译。 "" 的类型是 const char*
  2. strlen 返回字符串的长度而不是缓冲区大小。您需要添加 +1 以包含 NULL 字符。这是您最大的问题。
  3. 应该在堆栈上分配一个短的已知固定大小的小缓冲区,如ic。一个简单的字符数组。你也忘了free()它。

【讨论】:

  • 很好,感谢您的进一步解释。我仍然对 const char 类型感到困惑(维基百科并没有很好地解释我的口味)。我的问题是,是否有必要为所有声明的指针释放内存?分配内存的时间,之后一定要清空吗?非常感谢...
  • 内存管理是 C/C++ 的核心。我强烈建议您找一本书(很多存在)并阅读基础知识。它将为您节省大量时间。 const char 表示类型是常量 - 只读访问。 "" 可以在代码中的多个位置使用"" 的单个副本。如果在运行时更改,其他使用它的地方会失败。
猜你喜欢
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多