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

C 字符连接和内存重新分配,c,concatenation,base,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", st

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

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;
}
包括
包括
包括
int main(){
char*test=“”;
int i;
对于(i=0;i<10;i++)
字符*ic;
ic=malloc(2);
sprintf(ic,“%d”,i);
//printf(“%d\n”,strlen(test));
如果(strlen(test)==0)
测试=malloc(strlen(ic));
strcpy(测试,ic);
}否则{
realloc(测试,strlen(测试)+strlen(ic));
strcat(测试、集成电路);
}
}
printf(“%s\n”,测试);
//printf(“%c\n”,测试);
免费(测试);
test=NULL;
返回0;
}

我的目标是得到最终的
printf(“%s”,test)
be
0123456789

请记住字符串以空字符结尾。为字符串分配内存时,必须为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;
}
几个问题:

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

  • ic=malloc(2)-为什么?为什么不
    字符集[2]
    ?或者,为什么不简单地使用
    '0'+
    来获取数字的字符表示法呢?可能是因为这是一个学习练习。没错,感谢您抽出时间,非常感谢您快速清晰的解释。谢谢你的时间,我希望有一天能了解我自己。很好,谢谢你的进一步解释。我仍然对constchar类型感到困惑(维基百科并没有很好地解释这一点)。我的问题是,是否有必要为所有声明的指针释放内存?分配内存的时间,之后必须清空吗?非常感谢…内存管理是C/C++的核心。我强烈建议你找一本书(很多都有)读一些基础知识。这会节省你很多时间
    const char
    表示该类型为consant只读访问。使用
    的单个副本,可以在代码中的多个位置使用
    。如果它在运行时被更改,其他使用它的地方将失败。