字符串连接和内存重新分配

时间:2013-11-29 21:23:45

标签: c concatenation base

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

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

一些问题:

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