是代码,用于按输入的值反转它们。当我运行以下代码时。它仅接受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;
}
答案 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;
}