c++ - 如果我从未实际使用引用,那么引用越界数组元素是否安全?

标签 c++ arrays

我正在使用一个 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/

相关文章:

c++ - 使用模板模板参数的模板化构造函数的正确语法

PHP:从json数组获取数据而不循环

java - Java删除逻辑

java - 二维数组,输出不正确

Python:将 numpy 数组保存到 ROOT 文件

c++ - 模板参数推导和 SFINAE - 使用 std::enable_if

c++ - 奇怪的数字转换 C++

c - 结构中的二维数组 - 可能吗?

c++ - boost 示例未能构建

c++ - Arduino C++ 将对象作为参数传递