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;generateChars STD::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