通过指针将字符数组传输到另一个临时数组指针

3

我正在学习如何使用指针复制字符数组。

我有以下的C++代码。我想做的是通过指针将一个数组(set1)传递到另一个指针数组(temp)中。

但是当我尝试打印出(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个回答

5

// 为什么ABC没有被打印出来?

由于指针正在遍历未定义行为的区域,所以无法打印出来:

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

此外,

  1. 你没有在字符串的末尾使用 \0 进行终止(在你的代码中可能不需要)
  2. 在最后删除这个已损坏的指针 delete[].

由于你是为了学习而编写的,我建议对你的代码进行简单修复:

char* const temp = new char[256];
      ^^^^^ ensures `temp` is not modifiable

现在使用temp[i]进行遍历。

谢谢,我已经更新了代码以实现此功能。 for (int i = 0; i < 3; i++) { temp[i] = *p; ++p; } - user1033627

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

0

这是因为在循环复制数组时,您改变了temp。循环结束后,它指向复制数据的末尾。

此外,您忘记终止新分配的数组。您应该在末尾添加字符'\0'


0

C风格的字符串有一个空终止符——"ABC"包含四个字符。此外,我并不确定对temp进行的delete调用是否有效——自从它被'newed'以来,您一直在增加它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接