读取数组末尾是否安全?

mpe*_*pen 3 c++ pointers

假设我有一个像这样的构造函数:

MyColor(uint8 vec[]) {
r = vec[0];
g = vec[1];
b = vec[2];
a = vec[3];
}
Run Code Online (Sandbox Code Playgroud)

但我称之为(3个元素而不是4个):

uint8 tmp[] = {1,2,3};
MyColor c(tmp);
Run Code Online (Sandbox Code Playgroud)

但是现在vec[3]是未定义的...将此值赋给是否安全a?如果没有,没有很好的解决方法来检查是否vec[3]设置了吗?

Meh*_*ari 19

不,这不安全.它是标准定义的未定义行为.它可能会破坏整个应用程序或返回一个随机值.解决方法是将大小与其一起传递,或者vector改为使用.


sth*_*sth 13

不,这不安全.您正在读取尚未分配的内存,这是未定义的行为.根据月相的不同,您可能会或可能不会出现分段错误.

要"解决"它,请确保传入的数组始终具有正确的大小.在您的示例中,您可以:

uint8 tmp[4] = {1,2,3};
MyColor c(tmp);
Run Code Online (Sandbox Code Playgroud)

初始化程序不需要指定所创建的数组的所有元素,因此可以显式初始化前三个值.其余值将设置为零.