Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态内存分配_C++ - Fatal编程技术网

C++ 动态内存分配

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++) {

这是一段代码,用于在输入值时反转这些值。它只接受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++)
{
    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 << " ";
}