C++ 为什么未初始化的字符数组充满随机符号?

C++ 为什么未初始化的字符数组充满随机符号?,c++,cuda,char,C++,Cuda,Char,我有一段C++代码: 输出一些随机符号,如下所示: 所以我的第一个问题是:这个输出背后的原因是什么?它不应该是空格或者至少是相同的符号吗 我之所以担心这一点,是因为我在CUDA中编写程序,并且在_全局_函数中进行一些字符操作,因此使用string给出一个调用主机函数是不允许的错误。 但是,如果我使用足够大的字符数组,我操作的每个文本块的大小都不同,这意味着它不会总是完全利用字符数组,它有时没有完全填充,我留下了垃圾,如下图所示,挂在文本末尾: 所以我的第二个问题是:有没有办法避免这种情况 这一

我有一段C++代码:

输出一些随机符号,如下所示:

所以我的第一个问题是:这个输出背后的原因是什么?它不应该是空格或者至少是相同的符号吗

我之所以担心这一点,是因为我在CUDA中编写程序,并且在_全局_函数中进行一些字符操作,因此使用string给出一个调用主机函数是不允许的错误。 但是,如果我使用足够大的字符数组,我操作的每个文本块的大小都不同,这意味着它不会总是完全利用字符数组,它有时没有完全填充,我留下了垃圾,如下图所示,挂在文本末尾:

所以我的第二个问题是:有没有办法避免这种情况

这一输出背后的原因是什么

自动变量中的值是不确定的。标准没有指定它,所以它可能是空格,正如您所说,它可能是随机内容

[…]有时没有填满,我带着垃圾离开[…]

C中的字符串以null结尾,所以只要没有遇到null字节,任何专用于打印字符串的例程都将循环。在未初始化的内存中,此空字节随机出现或根本不出现。这些奇怪的尾随字符就是这样的结果

有没有办法避免这种情况


对。初始化它。

不,没有办法避免它。C++不自动初始化内置类型的自动变量,例如在您的情况下内置类型的数组,需要自己初始化它们。

将假定X86在该帖

中 这一输出背后的原因是什么

下面是在汇编中执行char x[50]时发生的大致情况:

从本质上讲,堆栈上移0x34字节必须可以被4整除。然后,堆栈上的空间变成x。没有清洁,没有变化,没有推动或弹出,只是这个空间变成了x。在放弃参数、返回地址和以前函数调用的变量之前存在的任何内容都将在x中

下面是执行新字符[50]时发生的大致情况:

与使用堆栈一样,您可以获得任何数据。一些程序或系统可能具有在分配或提交堆时将其归零的分配器,而其他程序或系统可能在分配但未提交堆时才归零,而有些程序或系统可能根本不归零。根据分配器的不同,您可能会得到干净的内存,也可能会得到重复使用和脏内存。这就是为什么这里的值可以是非零的,并且是不可预测的

有没有办法避免这种情况

在堆内存中,可以重载C++中的新和删除运算符,并且总是新分配的内存为零。您可以看到重载这些运算符的示例。至于堆栈上的内存,您只需接受每次将其归零即可

ZeroMemory(myArray, sizeof(myarray));

或者,对于这两种方法,您可以远离裸数组,使用std::vector或其他为您负责初始化的包装器。不过,您仍然需要确保初始化整数和其他数字或指针数据类型。

为什么您对这段代码有问题

char x[50];
cout << new char[50] << endl;
cout << x << endl;

然后记得稍后在y上调用delete来释放内存。是的,操作系统会帮你完成,但这绝不是编写好程序的好方法。

原因是什么您没有初始化它。有没有办法避免这种情况是的,初始化它。有没有用空格初始化它的捷径?cout@Schizo,是的,使用std::string并使用构造函数获取大小和填充字符。我理解所有关于内存泄漏的麻烦,但那只是演示而已我不该在新接线员那里发那条线…@Downvoter downvote的原因是什么?我忘了什么吗?
1. Control gets passed to the allocator
2. The allocator looks for any heap of sufficient size (readas: an already allocated but uncommited heap)
3. If 2 fails, the allocator makes a new heap
4. The allocator takes the heap (either the found or allocated one) and commits it
5. The address of that heap is returned to your code where it is used as a char*
ZeroMemory(myArray, sizeof(myarray));
char x[50];
cout << new char[50] << endl;
cout << x << endl;
char x[50] = {};
char* y = new char[50]();