我是C ++的初学者,我想使用动态内存分配技术而不是静态(如在数组中) 例如,我想制作一维数组 int a [100]; 我该如何用指针做同样的事情? 什么基本上我很困惑的是,我已经查看了互联网上的一些教程,他们做了像
int a[100];
int *arr = &a[0];
我发现它没用,因为首先我们声明大小为100的数组a,然后我们再次使用arr指针 我可以这样做吗
int a[1];
int *arr= &a[0];
现在,如果我确实为arr [i]分配随机值(从i = 0到i =用户定义) 会超越i = 1
接受它吗?答案 0 :(得分:3)
它会接受i = 1以外的
不,这是UB,因为您正在尝试访问您根本没有分配的内存。
你可能想要
int* a = new int[user_define_value];
// use it from a[0] ~ a[user_define_value - 1]
delete[] a;
顺便说一句:如果你想使用动态大小的数组,那么了解std::vector
是个好主意,而对于c ++中的静态大小数组则是std::array
。
答案 1 :(得分:1)
这是你在这里谈论的C代码,这些因为正确分配和调整大小而臭名昭着:
int *arr = malloc(sizeof(int) * 100);
那可能会回来NULL
这意味着你什么都没有,所以你必须测试它是否成功了。 C ++有new
运算符,如果失败则至少抛出异常,这样就更难忽略:
int *arr = new int[100];
如果您希望有效地使用C ++,那么您应该使用像std::vector
这样的C ++标准库容器:
std::vector<int> arr(100);
答案 2 :(得分:1)
重新启动代码段
int a[1];
int *arr= &a[0];
...你问
“如果我确实为arr [i]指定了随机值(从i = 0到i =用户定义),它会接受i = 1以外的
答案是,代码将被接受(可能带有警告),但它将具有未定义行为, UB ,因为您将会这样做存储超出分配数组末尾的值,该数组的大小仅为1。
没有自动扩展原始数组。
C ++中基本的动态大小数组是std::vector
。 E.g。
#include <vector>
using namespace std;
auto main() -> int
{
vector<int> a( 100 );
// Your code using it, here.
}
...动态分配缓冲区。它最后也会自动解除分配。它可以自动动态扩展,例如当您使用push_back
方法时。
使用原始指针,您可以改为
auto main() -> int
{
int* a = new int[100];
// Your code using it, here.
delete[] a;
}
...但这是更脆弱的代码,它缺少std::vector
的大部分功能,例如检查大小,附加,赋值和一般复制(特别是对于函数结果)。
即使声明的基本功能也不完全等效,因为std::vector
数组项默认为零初始化,而new
- 表达式产生未初始化的数组,具有不确定值的数组。但是,您可以通过添加空括号来指定您想要零初始化。然后它看起来像这样:
int* a = new int[100]();
这只是使用原始指针和原始数组时必须处理的无数细微之处。
作为初学者,你应该尽量避免使用原始指针和原始数组。
你无法完全避免它们(例如,main
采用原始数组参数,任何字符串文字都是原始数组,而C风格API处理原始数组),但是你越是避免它们,问题越少,你的工作效率越高。