为什么在以下类似的代码中,一个给出运行时错误,另一个没有



这真的很奇怪
考虑以下两个代码:-

#include <iostream>
using namespace std;
int main() {
int a[]={1,2,3,4,5};
int* ptr[5];
for(int i = 0; i < 5; i++)
{
*ptr[i]=a[i];
}
for(int i = 0; i < 5; i++)
{
cout<<*(ptr[i]);
}
}

#include <iostream>
using namespace std;
int main() {
int a[]={1,2,3,4,5};
int* ptr[5];

*ptr[0]=a[0];
*ptr[1]=a[1];
*ptr[2]=a[2];
*ptr[3]=a[3];
*ptr[4]=a[4];


cout<<*(ptr[0])<<endl;
cout<<*(ptr[1])<<endl;
cout<<*(ptr[2])<<endl;
cout<<*(ptr[3])<<endl;
cout<<*(ptr[4])<<endl;

}

第一个给出了运行时错误r,而第二个给出了1、2、3、4、5的输出,我找不到这两个代码之间的区别,有人能帮我找到区别吗。

#include <iostream>
using namespace std;
int main() {
int a[]={1,2,3,4,5};
int* ptr[5];

*ptr[0]=a[0];
*ptr[1]=a[1];


cout<<*(ptr[0])<<endl;
cout<<*(ptr[1])<<endl;


}

上面的代码运行良好,并给出输出1,2但是

#include <iostream>
using namespace std;
int main() {
int a[]={1,2,3,4,5};
int* ptr[5];

*ptr[0]=a[0];
*ptr[1]=a[1];
*ptr[2]=a[2];


cout<<*(ptr[0])<<endl;
cout<<*(ptr[1])<<endl;
cout<<*(ptr[2])<<endl;


}

这段代码在代码块(gcc(上出现运行时错误,我只是更加困惑

我有两个运行时错误。使用下面的指针变量重新编码的结果。


#include <iostream>
using namespace std;
int main() {
int a[]={1,2,3,4,5};
int* ptr[5];
for(int i = 0; i < 5; i++)
{
ptr[i]=&a[i];
}
for(int i = 0; i < 5; i++)
{
cout<<*(ptr[i]);
}
}

已经确定

*ptr[0] = a[0];

未分配指针是未定义的行为。

解决方案

ptr[0] = &a[0];

也已经给出了。这是有效的,但它是有限的,因为现在,ptr数组绑定到a,而您并不总是想要它。在这种情况下,您可能需要

ptr[0] = new int(a[0]);

这将使用a中的值初始化数组,但保持其独立性。然而,这引入了手动内存管理,在更复杂的代码中(内存泄漏、双重释放、悬挂指针(,这可能会变得棘手,因此更像C++的解决方案是(假设指针指向比整数更有趣的东西,因为现在似乎不需要指针(。

#include <memory>
#include <vector>
#include <iostream>
int main() {
int a[]={1,2,3,4,5};
std::vector<std::unique_ptr<int>> ptrs;
for(auto i: a)
{
ptrs.emplace_back(std::make_unique<int>(i));
}
for(auto& i: ptrs)
{
std::cout << *i;
}
}

最新更新