通过指针将char数组传递给另一个临时数组指针

时间:2011-11-07 11:32:57

标签: c++ arrays pointers

我正在学习使用指针来复制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;
}

4 个答案:

答案 0 :(得分:5)

  

//为什么不打印ABC?

因为您的指针在未定义的行为区域中行进:

char* temp = new char[256];
...
++temp;  // gone !!

最重要的是,

  1. 您最后没有使用\0终止字符串(代码中可能不需要)
  2. delete[]最终这个腐败的指针。
  3. 由于您是出于学习目的而写作,我建议您对代码进行简单修复:

    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'。