C中的std :: array equivalent

LDN*_*LDN 2 c arrays vector

我是C和C++的新手,我读过至少在C++中,当使用向量和数组时,最好使用std :: array或std :: vector,特别是在将它们传递给函数时.

在我的研究中,我发现了以下内容,这是有道理的.我想使用std :: vector会解决变量范围之外的索引问题.

void foo(int arr[10]) { arr[9] = 0; }

void bar() {
    int data[] = {1, 2};
    foo(data);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是错误的,但编译器认为一切都很好,并没有发出有关缓冲区溢出的警告.

而是使用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++中是绿色的草)

mel*_*ene 5

标准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).