我在显示来自几个指针字符的数据时遇到了一些麻烦。
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;
}
这次我做错了什么,为什么每次我尝试时都会显示垃圾数据。对不起,如果这已经是之前已经回答的问题。
答案 0 :(得分:3)
如果您尝试打印char *
,C ++会假定它是一个C样式的以null结尾的字符串。
看起来你正在分配(并传入指针)一个char
数组而没有终止空 - 所以,I / O库将跟随该字符,其中包含恰好位于的所有垃圾数据内存,直到碰巧遇到空字节。
一个简单的解决方案是传递char
或char &
,而不是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] << " ";