c++指针作为伪数组使用。在没有数组的情况下,将数字分配到内存的多个连续位置。

问题描述 投票:0回答:1

这与其说是一个问题,不如说是一个话题。看看下面的代码,计算第n个斐波那契数,并把所有的斐波那契数打印出来,直到第n个(namespace std pressumed,下面是main)。

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上也没有这样做.谢谢你的阅读。

c++ arrays pointers dynamic
1个回答
0
投票

那么它应该工作吗?

不,访问除 a[0] 产生未定义的行为,因为它在分配的内存之外。

它对你有用吗?

在某些情况下,它可能看起来是有效的。当您有未定义的行为时,任何事情都可能发生;没有要求检测到错误(见 为什么当我写到一个数组的末尾时,我不会得到一个分段故障?). 有可能它所使用的内存并没有用于其他任何东西,所以它不会引起明显的故障。但它也可能会导致被应用程序或库中一些不相关的部分使用的数据损坏;你可能不会立即注意到这个问题。

未定义行为的一个常见症状是,看似无害的变化会导致行为的意外变化。例如,程序中的打印语句可能会工作,但当你删除该语句时却失败了。


0
投票

你这样做的方式并不是 "内存安全 "的,因为你只是在为一个整数分配内存,并访问后续未分配的地址。这相当于声明一个确定大小的数组并访问大于其大小的索引。有几个选项可以做到你想要的。

手动分配内存

使用 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]);
}

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

© www.soinside.com 2019 - 2024. All rights reserved.