用作伪数组的c++指针.为不带数组的内存的多个连续位置指定数字



与其说这是一个问题,不如说是一个对话主题。查看以下用于计算第n个Fibonacci数的代码,并将所有代码打印到第n个(命名空间std pressumed,下面是主要内容(:

int n=20;
int *a=new int; //notice NO size declaration
a[0]=1;
a[1]=1;
for(int i=2; i<n;i++){
a[i]=a[i-1]+a[i-2];
}
for(int i=0; i<n;i++){
cout<<a[i]<<endl;
}

那么它应该起作用吗?它对你有用吗?关于它是否对某人不起作用,有什么评论吗?提前谢谢。这是我个人在1D中动态分配内存的方法,但我找不到任何关于这种方法的文档,而且我一直在使用它。当然,我在2D上不会这么做。感谢您的阅读。

那么它应该工作吗?

否。访问a[0]以外的任何索引都会产生未定义的行为,因为它在分配的内存之外。

它对你有用吗?

在某些情况下,它可能会起作用。当你有未定义的行为时,任何事情都可能发生;不要求检测到错误(请参阅当我在数组末尾之外写入时,为什么不出现分段错误?(。它使用的内存可能没有用于其他任何用途,因此不会导致明显的故障。但它也可能导致应用程序或库的某些无关部分使用的数据损坏;你可能不会立即注意到这个问题。

未定义行为的一个常见症状是,看似无害的变化会导致行为的意外变化。例如,程序可能使用其中的print语句,但删除该语句时会失败。

执行此操作的方式不是"内存安全"的,因为您只为单个整数分配内存,并访问尚未分配的后续地址。这相当于声明一个大小确定的数组并访问大于其大小的索引。有几个选项可以做你想做的事:

手动分配内存

使用malloc()来分配所需的字节数。使用后应使用free()。编译器不会为你做这件事。

int n=20;
int *a = malloc(sizeof(int) * n);
a[0]=1;
a[1]=1;
for(int i=2; i<n;i++){
a[i]=a[i-1]+a[i-2];
}
free(a);

使用C++向量容器

矢量是动态大小的数组。它们可以自动更改大小,非常有用。点击此处阅读更多信息。

int n=20;
std::vector<int> a;
a.push_back(1);
a.push_back(1);
for(int i=2; i<n;i++){
a.push_back(a[i-1]+a[i-2]);
}

编辑:澄清使用malloc()后需要free()

最新更新