我正在做一个练习,我必须将c风格的字符串复制到免费商店分配的内存中。我需要这样做而不使用下标并仅依靠指针算法。我写了以下函数 -
char* str_dup(const char* s)
{
// count no. of elements
int i = 0;
const char* q = s;
while (*q) { ++i; ++q; }
//create an array +1 for terminating 0
char* scpy = new char[i + 1];
//copy elements to new array
while (*s)
{
*scpy = *s;
++s;
++scpy;
}
*scpy = 0;
return scpy;
}
该函数返回随机字符。但如果我把它改成这个 -
char* str_dup(const char* s)
{
// count no. of elements
int i = 0;
const char* q = s;
while (*q) { ++i; ++q; }
//create an array +1 for terminating 0
char* scpyx = new char[i + 1];
char* scpy = scpyx;
//copy elements to new array
while (*s)
{
*scpy = *s;
++s;
++scpy;
}
*scpy = 0;
return scpyx;
}
它有效。有人可以解释一下为什么第一个代码不起作用而第二个代码正在工作吗?
答案 0 :(得分:4)
第一个代码无效,因为您返回scpy
的最终值,此时该点指向终止NUL字符,而不是字符串的开头。
一个解决方案就是像你一样做,并保存原始指针的副本以便返回。
你应该真的使用strlen()
和memcpy()
,它们会让你更容易,但也许它们对你不利。