C++ 动态内存分配
这是一段代码,用于在输入值时反转这些值。它只接受8个输入。在那之后,它不会打印任何东西C++ 动态内存分配,c++,C++,这是一段代码,用于在输入值时反转这些值。它只接受8个输入。在那之后,它不会打印任何东西 #include <iostream> using namespace std; int main() { int n; cin>>n; int *p = new int(sizeof(int)*n); int q = n; for(int i=0;i<n;i++) { cin>>*p; p++; } for(int j=0;j<n;j++) {
#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
int *p = new int(sizeof(int)*n);
int q = n;
for(int i=0;i<n;i++)
{
cin>>*p;
p++;
}
for(int j=0;j<n;j++)
{
cout<<*p<<" ";
p--;
}
return 0;
}
#包括
使用名称空间std;
int main(){
int n;
cin>>n;
int*p=新的int(sizeof(int)*n);
int q=n;
对于(int i=0;i>*p;
p++;
}
对于(int j=0;j,您也可以尝试以下答案
#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
int *p = (int *)malloc(sizeof(int)*n);
int q = n;
for(int i=0;i<n;i++)
{
cin>>*p;
p++;
}
for(int j=0;j<n;j++)
{
p--;
cout<<*p<<" ";
}
free(p);
return 0;
}
#包括
使用名称空间std;
int main(){
int n;
cin>>n;
int*p=(int*)malloc(sizeof(int)*n);
int q=n;
对于(int i=0;i>*p;
p++;
}
对于(int j=0;jOk),这里有很多问题:
int *p = new int(sizeof(int)*n);
此内存分配错误。它分配n倍大小的(int)字节,因此如果int
长度为4字节,它将分配n*4
整数
int q = n;
q
变量从未使用过
for(int i=0;i<n;i++)
{
cin>>*p;
p++;
}
这里也一样
return 0;
}
您已分配内存,但从未解除分配。这将导致内存泄漏
更好、正确的程序版本可能是:
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int * p = new int[n];
for (int i = 0; i < n; ++i)
{
cin >> p[i];
}
for (int i = (n - 1); i >= 0; --i)
{
cout << p[i] << ' ';
}
delete [] p;
return 0;
}
#包括
使用名称空间std;
int main()
{
int n;
cin>>n;
int*p=新的int[n];
对于(int i=0;i>p[i];
}
对于(int i=(n-1);i>=0;--i)
{
库特
上面分配的是单个int对象,其值为sizeof(int)*n
,并且p
指向该整数。您的意思可能是:
int *p = (int*)malloc(sizeof(int)*n); // bad style
... at the end:
free(p);
<>但是在C++中使用<代码> MalOC < /Cord>是个坏主意,除非你想更接近操作系统来教育目的。
稍微好一点的方法是使用new
,它除了分配对象外,还调用它们的构造函数(但没有为基本类型(如int
)构造任何对象)
以上不是最佳做法,因为它需要手动内存管理。相反,建议尽可能使用智能指针或容器:
std::vector<int> p(n);
// continue with the code, just like with the pointers
替换指针递减和取消引用的顺序可避免崩溃:
for(int j=0;j<n;j++)
{
p--;
std::cout << *p << " ";
}
for(int j=0;jj)“它没有打印任何东西”是什么意思?执行它时,它几乎是在打印您想要的输出,除了第一个元素总是0
,所以它永远不会打印最后一个:n=8
,output=0 8 7 6 5 4 3 2
它不是在第二个循环中打印值。现在我得到了解决方案。它应该是int*p=new int[n];它应该是一个数组。谢谢new int(sizeof(int)*n)
分配单个int
并将其初始化为sizeof(int)*N/COD>你需要花更多的时间,找到新的教程,或者重新阅读你的课堂笔记。在C++中使用<代码> MalcC 和免费< /COD>几乎是个好主意。你的问题是与<代码>新< /Cord>表达式,但这不是你所声称的。(如果是,它将分配到许多元素,虽然这是浪费,但不会导致那么多问题)。请阅读完整的答案,从…这里有很多问题:…
,但您没有真正解决OP的代码中的新问题…new int(n)
在语义上仍然不正确,将再次导致UB和可能的崩溃。是的,在…更正之前,我怎么可能看不到这一点。
int *p = (int*)malloc(sizeof(int)*n); // bad style
... at the end:
free(p);
int *p = new int[n]; // so-so style
... at the end:
delete [] p;
std::vector<int> p(n);
// continue with the code, just like with the pointers
std::vector<int> p;
p.reserve(n); // this is a minor optimization in this case
// ...
if (int value; std::cin >> value)
// This is how to add elements:
p.push_back(value);
else
std::cin.clear();
int q = n;
for(int i=0;i<n;i++)
{
cin>>*p;
p++;
}
for(int j=0;j<n;j++)
{
cout<<*p<<" ";
p--;
}
for(int j=0;j<n;j++)
{
p--;
std::cout << *p << " ";
}