我是C和C++的新手,我读过至少在C++中,当使用向量和数组时,最好使用std :: array或std :: vector,特别是在将它们传递给函数时.
在我的研究中,我发现了以下内容,这是有道理的.我想使用std :: vector会解决变量范围之外的索引问题.
Run Code Online (Sandbox Code Playgroud)void foo(int arr[10]) { arr[9] = 0; } void bar() { int data[] = {1, 2}; foo(data); }上面的代码是错误的,但编译器认为一切都很好,并没有发出有关缓冲区溢出的警告.
而是使用std :: array或std :: vector,它们具有一致的值语义,并且缺少产生如上所述错误的任何"特殊"行为.
(回复bames53,谢谢顺便说一句!)
我想要编码的是
float foo(int X, int Y, int l){
// X and Y are arrays of length l
float z[l];
for (int i = 0; i < l; i ++){
z[i] = X[i]+Y[i];
}
return z;
}
int bar(){
int l = 100;
int X[l];
int Y[l];
float z[l];
z = foo(X,Y,l);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望这个用C编码,所以我的问题是是否有一个用于C的std :: vector构造?我找不到任何东西.
在此先感谢,也请原谅我的编码(我在C和C++中是绿色的草)
标准C没有任何相似std::vector或其他容器结构.你得到的只是内置数组和malloc.
我想使用std :: vector会解决变量范围之外的索引问题.
您可能会这么认为,但您错了:在a的范围之外进行索引std::vector与使用内置数组一样糟糕.所述operator[]的std::vector不进行任何边界检查任一个(或至少它不能保证).如果要检查索引操作,则需要使用arr.at(i)而不是arr[i].
还要注意代码就好
float z[l];
...
return z;
Run Code Online (Sandbox Code Playgroud)
是错误的,因为C(或C++)中没有数组值.当您尝试获取数组的值时,实际上会获得指向其第一个元素的指针.但是当函数返回时,第一个元素(以及所有其他元素和整个数组)被销毁,所以这是一个经典的释放后使用的bug:调用者获得一个悬挂指向不再存在的对象的指针.
习惯的C解决方案是让调用者处理内存分配并传递函数刚刚写入的输出参数:
void foo(float *z, const int *X, const int *Y, int l){
// X and Y are arrays of length l
for (int i = 0; i < l; i ++){
z[i] = X[i]+Y[i];
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,有一些库为C提供动态数据结构,但它们看起来和感觉与C++非常不同std::vector(例如我知道GLib).