动态内存分配

时间:2019-04-01 05:57:45

标签: 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++)
{
    cout<<*p<<" ";
    p--;
}
return 0;
}

3 个答案:

答案 0 :(得分:0)

您也可以尝试以下答案。

#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;
}

答案 1 :(得分:0)

#include <iostream>
using namespace std;

(与标题无关,但是using namespace std是一种不好的做法,例如,在切换编译器时可能会导致中断。最好在需要时编写std::前缀,例如std::cin >>

int main() {
int n;
cin>>n;
int *p = new int(sizeof(int)*n);

上面是分配一个int对象,其值是sizeof(int)*n,而p指向该整数。您可能是说:

int *p = (int*)malloc(sizeof(int)*n); // bad style
... at the end:
free(p);

但是在C ++中使用malloc是个坏主意,除非您出于教育目的更接近操作系统。

使用new稍微好一点,int除了分配对象外,还调用它们的构造函数(但对于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++;
}

这看起来还可以:

p

但是这是坏的。循环开始时,*p指向最后一个元素。以下for(int j=0;j<n;j++) { cout<<*p<<" "; p--; } 取消引用了经过最后一个元素的指针:

for(int j=0;j<n;j++)
{
    p--;
    std::cout << *p << " ";
}

替换指针递减和取消引用的顺序可以避免崩溃:

library(openNLP)
sent_token_annotator = Maxent_Sent_Token_Annotator()
word_token_annotator = Maxent_Word_Token_Annotator()
pos_tag_annotator = Maxent_POS_Tag_Annotator()
pos_annotation = NLP::annotate(wc_text1, list(pos_tag_annotator, sent_token_annotator, word_token_annotator))
# Error in e(s, a) : no sentence token annotations found

答案 2 :(得分:-1)

好的,这里有很多问题:

int *p = new int(sizeof(int)*n);

此内存分配错误。它会分配n倍的sizeof(int)字节,因此,如果int为4字节长,它将分配n * 4整数。

int q = n;

q变量从不使用。

for(int i=0;i<n;i++)
{
    cin>>*p;
    p++;
}

这里不需要指针算术。最好以简单的p[i]方式访问数组。

for(int j=0;j<n;j++)
{
    cout<<*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;
}