首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Char连接和内存重新分配

Char连接和内存重新分配
EN

Stack Overflow用户
提问于 2013-11-30 05:23:45
回答 2查看 135关注 0票数 0

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

代码语言:javascript
复制
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) be 0123456789的结果。

EN

回答 2

Stack Overflow用户

发布于 2013-11-30 05:33:41

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

代码语言:javascript
复制
test = malloc(strlen(ic) + 1);

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-11-30 05:37:00

以下是几个问题:

  1. char *test=""; -将测试指向一个常量C字符串。您不需要对它进行编写,但是它很危险,而且可以用C++进行编译。""的类型是const char*.
  2. strlen,返回字符串的长度,而不是缓冲区的大小。您需要添加+1才能包含空字符。这是你最大的问题,
  3. ic这样的短的已知的固定大小的小缓冲区应该被分配到堆栈上。一个简单的char数组。你也忘了free()它。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20293543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档