指针有问题

时间:2016-03-28 22:13:12

标签: c++

我在显示来自几个指针字符的数据时遇到了一些麻烦。

int main()
{
    char *arr = new char();
    for (int t = 0;t < 10;t++)
    {
        int size = Generator::GetInstance()->Generate(arr);
        for (int generateChars = 0;generateChars < size;generateChars++)
        {
            std::cout << &arr[generateChars] << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}

和Generator类

int Generator::Generate(char *ar)
{
    srand(time(NULL));
    int size = (rand() % 10)+1;
    arr = new char[size];
    for (int t = 0;t < size;t++)
    {
        int path = rand() % 4;
        switch (path)
        {
            case 0:
                arr[t] = 'U';
                break;
            case 1:
                arr[t] = 'R';
                break;
            case 2:
                arr[t] = 'D';
                break;
            case 3:
                arr[t] = 'L';
                break;
        }
    }
    arr[size] = '\0';
    *ar = *arr;
    return size;
}

这次我做错了什么,为什么每次我尝试时都会显示垃圾数据。对不起,如果这已经是之前已经回答的问题。

2 个答案:

答案 0 :(得分:3)

如果您尝试打印char *,C ++会假定它是一个C样式的以null结尾的字符串。

看起来你正在分配(并传入指针)一个char数组而没有终止空 - 所以,I / O库将跟随该字符,其中包含恰好位于的所有垃圾数据内存,直到碰巧遇到空字节。

一个简单的解决方案是传递charchar &,而不是char *,以便I / O能够正确地将其解释为单个字符。

然而,这不会修复您的内存泄漏,这是一个单独的问题。如果您想将C ++用于除玩具程序之外的任何事情,那么当您不再需要时,您应养成delete - 由new分配的任何内容的习惯。

最后,如评论中所述,您的代码对于C ++来说非常非惯用。使用像这样的低级代码实际上非常有教育意义,但标准库有std::string和各种容器,可以更容易地正确管理你的内存,所以请确保你学习如何使用它们,以及理解它们构建的低级功能......

答案 1 :(得分:1)

更改您的&#34;生成&#34;函数参数从指针到指针引用:

int Generator::Generate(char *& ar)

然后换行:

*ar = *arr;

在你的&#34;生成&#34;功能:

ar = arr;

还要记得清除任何动态内存&#34; ar&#34;可以指出,当&#34;生成&#34;被称为。

我测试了这段代码,它对我有用......

编辑在&#34; for&#34;显示数组的循环,更改行:

std::cout << &arr[generateChars] << " ";

为:

std::cout << arr[generateChars] << " ";