将c-string char by char复制到动态char *

时间:2018-02-01 04:12:58

标签: c c-strings

我有一个const char*字符串,我希望将该字符串逐字符复制到动态`char *。

const char *constStr = "Hello world";
char *str = (char*) malloc(strlen(constStr)+1);
while(*constStr){
   *str = *constStr;
   constStr++;
   str++;
}
printf("%s", str);
free(str);

问题是以前的代码只是将constStr的每个字符复制到str的第一个索引。我不知道为什么?

4 个答案:

答案 0 :(得分:2)

正如其他人所指出的那样,你在每次迭代中递增str指针,所以你总是打印出字符串的结尾。

您可以在不增加指针的情况下迭代每个字符。以下代码对我有用:

const char *constStr = "Hello world";
int len = strlen(constStr);
char *str = (char *) malloc(len + 1);
int i;
for (i = 0; i <= len; ++i) {
    str[i] = constStr[i];
}
printf("%s", str);
free(str);

答案 1 :(得分:2)

是的,你没有null终止字符串。这是主要问题。为了更清楚,并不是你没有nul终止字符串这是问题,而是你使用它们,其中指向nul终止char数组的指针是预期的问题。但即使你这样做,代码中也存在大量问题。

您分配了内存并且已经转换了malloc的返回值,这是不必要的。隐含地进行了void*char*转换。

malloc可能无法为请求提供服务,它可能会返回空指针。重要的是要 检查这一点以防止以后尝试取消引用空指针。

然后你开始复制 - 你复制了除NUL终止字符以外的所有内容。然后你把它传递给printf的{​​{1}}格式说明符,它需要一个指向空终止char数组的指针。这是未定义的行为。

%s中的一个位置未初始化 - 请注意,访问未初始化的值可能会导致未定义的行为。

还有另一个问题,来自标准§7.22.3.3

  

str函数导致free指向的空间被释放,即可用于进一步分配。如果ptr是空指针,则不执行任何操作。 否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义

是的,情况就是这样吗?您拨打ptr free(str)时没有指向str返回的动态分配内存。这又是未定义的行为。

解决方案始终是保留一个指针,该指针存储已分配块的地址。其他答案已经显示出来了(不重复它们 - 两者都提供了一个很好的解决方案)。

您也可以使用mallocstrdup - 即使您现在不需要它们 - 也习惯了它们。了解这些有助于此。是strcpy不是标准的一部分,它是POSIX标准的东西。

示例:

strdup

答案 2 :(得分:1)

这是“经典”字符串复制解决方案:

const char *constStr = "Hello world";
char *str = malloc(strlen(constStr) + 1), *p = str;
/* Do not forget to check if str!=NULL !*/
while((*p++ = *constStr++));
puts(str);

答案 3 :(得分:0)

  

问题是以前的代码只复制了每个字符   constStr只是str的第一个索引。我不知道为什么?

  1. 使用索引变量。
  2. 不要忘记终止'\ 0',因为你很有可能出现分段错误。