我已经用其他语言编写了一段时间并且非常熟练,但是现在我更深入地学习C ++并遇到了一些我从未在其他语言中遇到的奇怪问题。谷歌搜索无法回答的最令人沮丧的是两个不同的代码订单。
背景是我有一个整数数组,一个指针是数组中的一个元素。当我去打印指针时,一个方法打印正确,另一个打印无意义。
第一个代码顺序的示例是:
#include <iostream>
using namespace std;
void main(){
int *pAry;
int Ary[5]={2,5,2,6,8};
pAry=&Ary[3];
cout<<*pAry<<endl;
system("pause");
}
它按预期工作。然而,这个简单的顺序不适用于整个项目,因为我希望其他模块访问pAry,所以我认为全局定义应该有效,因为它适用于其他语言。这是一个例子:
#include <iostream>
using namespace std;
int *pAry;
void evaluate();
void main(){
evaluate();
cout<<*pAry<<endl;
system("pause");
}
void evaluate(){
int Ary[5]={2,5,2,6,8};
pAry=&Ary[3];
}
当我使用第二种方法时,输出是无意义的。特别是1241908 ....当答案应该是6。
首先,我想知道为什么我的全局方法不起作用,其次我想知道如何使其工作。感谢
答案 0 :(得分:8)
在第二个示例中,Ary
是函数evaluate
的本地。当evaluate
返回时,Ary
超出范围,访问它的内存区域会导致未定义的行为。
要避免这种情况,请在您尝试访问它时仍然有效的范围内声明Ary
。
答案 1 :(得分:4)
它不起作用,因为你的pAry
指向一个本地数组,当你从evaluate()
返回时会被销毁。这是未定义的行为。
一种可能的解决方法是使本地数组静态:
static int Ary[5]={2,5,2,6,8};
答案 2 :(得分:3)
在evaluate()
函数中,您将pAry
瞄准该变量(实际数组元素) local 到该函数。只有指向的对象仍然存在,才能取消引用指针。当本地物体超出范围时,它们就不复存在;在这种情况下,这意味着当Ary
结束时evalute()
的所有元素都不存在,因此pAry
成为悬空指针(它不指向任何有效位置)。
取消悬挂指针会给出未定义的行为; 在您的特定情况下,它会输出一个垃圾值,但它可能也会崩溃或(最糟糕的是)似乎工作正常,直到程序发生变化后面。
要解决此问题,您既可以将Ary
设为全局,也可以设为static
:
void evaluate(){
static int Ary[5]={2,5,2,6,8};
pAry=&Ary[3];
}
静态局部变量在函数调用之间持续存在(它从第一次初始化到程序终止时存在),因此指针将重新生成有效。
答案 3 :(得分:1)
问题是您需要使用文件范围声明Ary
。
int Ary[] = {1,2,3,4,5};
void print_ary(void); // The void parameter is a style thingy. :-)
int main(void)
{
print_ary();
return EXIT_SUCCESS;
}
void print_ary(void)
{
for (unsigned int i = 0; i < (sizeof(Ary) / sizeof(Ary[0]); ++i)
{
std::cout << Ary[i] << std::endl;
}
}
更好的解决方案是将std::vector
传递给您的函数而不是使用全局变量。