C++ 指针有问题吗

C++ 指针有问题吗,c++,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++)

我在显示来自几个指针字符的数据时遇到一些问题

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;
}
intmain()
{
char*arr=new char();
for(int t=0;t<10;t++)
{
int size=Generator::GetInstance()->Generate(arr);
for(int-generateChars=0;generateCharsSTD::CUT< P>如果您尝试打印<代码> char */COD>,C++假定它是C风格的空终止字符串。
看起来您正在分配(并将指针传递到)一个
char
数组,而没有终止null——因此,I/O库将在该字符后面跟随内存中的所有垃圾数据,直到它遇到一个null字节

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

<>但是,这不会修复你的内存泄漏,这是一个单独的问题。如果你想用C++来处理玩具程序之外的任何事情,你就应该养成<代码>删除<代码>的习惯,在你不再需要它的时候,按<代码>新< /Cord>分配的任何东西。
<>最后,如注释所述,你的代码对于C++来说是非常不习惯的,它实际上是很有教育意义的,用这样的低级代码来播放,但是标准库有<代码> STD::String 以及各种容器,使你更容易正确地管理你的内存,所以确保你学会如何使用它们,以及理解下面的低级特性:

< p>如果您尝试打印<代码> char */COD>,C++假定它是C风格的空结尾字符串。 看起来您正在分配(并将指针传递到)一个
char
数组,而没有终止null——因此,I/O库将在该字符后面跟随内存中的所有垃圾数据,直到它遇到一个null字节

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

<>但是,这不会修复你的内存泄漏,这是一个单独的问题。如果你想用C++来处理玩具程序之外的任何事情,你就应该养成<代码>删除<代码>的习惯,在你不再需要它的时候,按<代码>新< /Cord>分配的任何东西。 <>最后,如注释所述,你的代码对于C++来说是非常不习惯的,它实际上是很有教育意义的,用这样的低级代码来播放,但是标准库有<代码> STD::String 以及各种容器,使你更容易正确地管理你的内存,所以确保你学会如何使用它们,以及了解它们所基于的低级功能…

将“生成”函数参数从指针更改为指针引用:

int Generator::Generate(char *& ar)
并更改行:

*ar = *arr;
std::cout << &arr[generateChars] << " ";
这在“生成”函数中用于:

ar = arr;
还记得在调用“Generate”时清除“ar”可能指向的任何动态内存

我测试了这个代码,它对我有效

编辑在显示阵列的“for”循环中,更改行:

*ar = *arr;
std::cout << &arr[generateChars] << " ";
std::cout将“生成”函数参数从指针更改为指针引用:

int Generator::Generate(char *& ar)
并更改行:

*ar = *arr;
std::cout << &arr[generateChars] << " ";
这在“生成”函数中用于:

ar = arr;
还记得在调用“Generate”时清除“ar”可能指向的任何动态内存

我测试了这个代码,它对我有效

编辑在显示阵列的“for”循环中,更改行:

*ar = *arr;
std::cout << &arr[generateChars] << " ";

std::你是不是碰巧来自Java背景?你在main中分配
arr
,然后再在
Generate
中分配,这会导致问题。
Generate
函数负责分配内存。因此在
main
中不需要这样做:
char*arr=new char()
此外,你的
生成
函数对传入的指针完全不能做任何改变,因为你是按值传递指针的。假设你想要一个U、R、D和L的随机组合字符串数组,那么你真的需要研究
std::string
std::vector
并停止直接使用
new
。此外,使用
delete
之后,您并没有释放内存,这是您需要执行的操作。此外,
arr
Generate
函数中来自何处。请不要说它是一个全局变量。您是否碰巧来自Java背景?您是在中分配
arr
main,然后在
Generate
中再次执行,这将导致问题。
Generate
函数负责分配内存。因此,在
main
中无需执行此操作:
char*arr=new char()
此外,你的
生成
函数对传入的指针完全不能做任何改变,因为你是按值传递指针的。假设你想要一个U、R、D和L的随机组合字符串数组,那么你真的需要研究
std::string
std::vector
并停止直接使用
new
。另外,使用
delete
之后,您不会释放内存,这是您需要执行的操作。另外,
arr
Generate
函数中来自何处。请不要说它是一个全局变量。谢谢。帮助很大。不,问题。我很高兴为您服务。:)还有一件事,从显示字符数组的行中删除“address of”(&)运算符:
std::cout谢谢。帮助很大。没问题。我很乐意为您服务。:)还有一件事,从显示字符数组的行中删除“address of”(&)运算符:
std::cout