C ++错误:"获取临时数组的地址"

时间:2015-10-05 05:31:48

标签: c++ arrays

我试图在if语句中声明一个数组。我以这种方式编写代码,以便在if-block退出后对象保持在范围内,但现在我有一个新问题:"获取临时数组的地址"。如何以另一种方式重写这个,以便为maskArray分配正确的值?

int* maskArray;
if(conditional==true)
   maskArray = (int[9]) {0,1,0,1,-4,1,0,1,0};

6 个答案:

答案 0 :(得分:3)

假设您不打算稍后修改strict mode指向的内容,那么最好/最简单的解决方案是:

maskArray

如果您从未计划更新数组,则静态const有效,但如果您要更新它,则需要单独的副本。这可以在堆栈上或堆上创建。要在堆栈上创建它:

const int* maskArray;
if(conditional==true)
{
     static const int myArray[9] = {0,1,0,1,-4,1,0,1,0};
     maskArray = &myArray[0];
}

要在堆上动态创建阵列的新副本,您需要使用int* maskArray; int myArray[9] = {0,1,0,1,-4,1,0,1,0}; if(conditional==true) { maskArray = &myArray[0]; } // when `myArray` goes out of scope, the pointer stored in maskArray will be useless! If a longer lifetime is needed, use the heap (see below). 分配内存。这样做的好处是,在您决定删除它之前,它可以保留一段时间。

new[]

请记住稍后使用int* maskArray; if(conditional==true) { maskArray = new int[9] {0,1,0,1,-4,1,0,1,0}; } 删除

答案 1 :(得分:2)

v创建一个临时数组,一旦完整语句完成就会被销毁。 (注意,这在技术上不是C ++,而是C99的一个特性,你的编译器支持它作为C ++中的扩展。)

"records_available"获取该临时数组,将其转换为指针并将该指针存储在(int[9]) {0,1,0,1,-4,1,0,1,0}中。一旦此语句完成,临时数组将被销毁,maskArray = (int[9]) {0,1,0,1,-4,1,0,1,0};中的值将不再有效。

使用这种临时数组的唯一方法是在同一个语句中使用它,例如将它传递给将使用它的函数:

maskArray

这没关系,因为即使临时数组被销毁,它也会在函数返回后被销毁,并且没有任何东西在使用数组。 (并且函数最好不要以某种方式将长期存在的引用或指针存储到数组中,但那与正常情况没有区别。)

答案 2 :(得分:2)

只能在声明数组时初始化数组。因此,如果它需要在循环中作用域,则在循环内声明一个数组:

int* maskArray;
if (conditional == true) {
    int locArray[] = {0,1,0,1,-4,1,0,1,0};
    maskArray = locArray;
    // ...
} // locArray goes out of scope here
// BEWARE : maskArray is now a dangling pointer (maskArray = NULL is safer)

正如M.M所注意到的,你可以通过在块内声明它来避免悬空maskArray(或者如果你可以直接使用locArray则省略它):

if (conditional==true) {
    int locArray[] = {0,1,0,1,-4,1,0,1,0};
    int *maskArray = locArray; // may be fully omitted if locArray is enough
}

答案 3 :(得分:1)

您可以使用临时数组来实现此目的

int temp [] = {0,1,0,1,-4,1,0,1,0};
size_t n = sizeof(temp)/sizeof(int);

if (condition == true )
{
   maskArray = new int[n]{0,1,0,1,-4,1,0,1,0};
}

// ...

delete [] maskArray; // Free memory after use

或者只使用std::vector

std::vector<int> maskArray;

if( condition == true )
{
  maskArray = {0,1,0,1,-4,1,0,1,0}; // C++11 initializer_list vector assignment
}

答案 4 :(得分:0)

虽然确实是原始构造在C ++中无效,但标准C ++确实具有相当相似的功能:可以使用显式类型名称和列表初始化器创建临时数组

using I9 = int [9];
I9{ 0, 1, 0, 1, -4, 1, 0, 1, 0 };

上面是临时数组对象的有效C ++语法。但是,如果您尝试在GCC中使用它,则会很快发现GCC拒绝将数组到指针的转换应用于此类临时数组,例如

using C10 = char [10];
C10 str;
std::strcpy(str, C10{ 'a', 'b', 'c' });
// GCC: error: taking address of temporary array

上面的代码是完全有效的C ++,但是GCC中的错误阻止了它的编译。 Clang和MSVC接受此代码。

在您的原始代码中,您实际上依赖于GCC扩展,该扩展允许您在C ++代码中使用C风格的复合文字语法,但是此扩展显然碰到了相同的错误如上所述。

答案 5 :(得分:-1)

response = urllib.request.urlopen(url)

content = response.read()

videos = json.loads(content.decode('utf8'))

print(videos)