我正在学习使用指针来复制char数组。
我在C ++中有以下代码。我正在尝试做的是使用指向另一个指针数组(temp)的传输和数组(set1)。
但是当我尝试打印(temp)时,它与(set1)不一样。
通过指针将数组传输到另一个临时数组指针。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
char set1[] = "ABC";
char* p = &set1[0];
int tempSize = 0;
char* temp = new char[256];
for (int i = 0; i < 3; i++)
{
*temp = *p;
cout << *temp; // ABC
++temp;
++tempSize;
++p;
}
cout << "\n";
for (int i = 0; i < tempSize; i++)
{
cout << temp[i]; // Why ABC is not printed?
}
delete [] temp;
return 0;
}
答案 0 :(得分:5)
//为什么不打印ABC?
因为您的指针在未定义的行为区域中行进:
char* temp = new char[256];
...
++temp; // gone !!
最重要的是,
\0
终止字符串(代码中可能不需要)delete[]
最终这个腐败的指针。由于您是出于学习目的而写作,我建议您对代码进行简单修复:
char* const temp = new char[256];
^^^^^ ensures `temp` is not modifiable
现在使用temp[i]
进行遍历。
答案 1 :(得分:0)
这是因为在复制数组的循环中,您更改了temp
。在循环之后,它指向超出复制数据的一个。
此外,您忘记终止新分配的数组。您应该在最后添加字符'\0'
。
答案 2 :(得分:0)
问题在于这一行:
++temp;
您正在递增指针然后写入它。最后temp[i];
并未指向字符串的开头,而是指向结尾。
最简单的方法是删除第一个for
循环:
for (int i = 0; i < 3; i++)
{
temp[i] = set1[i];
}
temp[4] = '\0'; // don't forget to close the string
答案 3 :(得分:0)
C风格的字符串有一个空终止符 - “ABC”包含四个字符。另外,我完全不确定对temp的删除调用是否有效 - 你一直在增加它,因为它是'newed'。