我正在使用一个 API,其中调用者传入一个指向内容的指针数组,以及数组的长度。为了使我的代码更具可读性/可维护性,我希望能够有效地为每个参数命名,而不是将它们称为 arg[0]
、arg[1]
等。声明对所有可能参数的引用是否安全,即使传入数组的长度可能因可选参数而不同?
我正在尝试做这样的事情:
void myFunc(int out_args[], size_t nargs) {
int &foo = out_args[0];
int &bar = out_args[1]; // bar is optional argument. is this safe?
...
foo = 5;
if(2 >= nargs)
bar = 10;
...
}
请注意,参数是输出 参数,所以我真的很想引用它们。 那么,如果我从未实际使用过 args[1] 的悬空引用是否安全?
我的猜测是这是安全的,因为我想象引用的实现方式是将引用的变量声明中的 &
视为 * const
,并且每当我使用引用,然后编译器会自动为我解除对指针的引用。也就是说,在幕后,我想我写的东西被翻译成了类似的东西
void myFunc(int out_args[], size_t nargs) {
int *const foo = &out_args[0];
int *const bar = &out_args[1]; // bar is optional argument. is this safe?
...
*foo = 5;
if(2 >= nargs)
*bar = 10;
...
}
在这种情况下,我相信代码实际上从来没有访问它不应该访问的内存,所以如果上面的版本等同于此,那么我应该没问题,对吧?
编辑: 我基本上是在编写一个插件,而我正在使用但无法做任何事情的 API 可以使用类似的东西调用我的代码
int ret_vals[1]; // only care about 1 return value
myFunc(ret_vals, 1);
或
int ret_vals[2]; // care about both return values
myFunc(ret_vals, 2);
甚至
myFunc(NULL, 0); // ignore all return values; just marvel at the side effects
而且我的代码需要在所有情况下都能正常工作。
最佳答案
如果 args
不是指向至少包含两个元素的数组的第一个元素的指针,则计算表达式 args[1]
是未定义的行为。立即取地址,如&args[1]
,仅当args
指向至少一个元素的数组的第一个元素时才有效。
基本上,不要这样做。
关于c++ - 如果我从未实际使用引用,那么引用越界数组元素是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19554198/