【问题标题】:Unable to dereference a pointer pointing to an array无法取消引用指向数组的指针
【发布时间】:2021-11-01 17:07:06
【问题描述】:

我已将 指向指针的指针 作为参数传递给函数,目标是在该函数内部创建一个数组。我已经正确地完成了这一步,并且在函数内部检查了数组的 *地址和值local)以及 pointed 指针(@987654322 @) 并且它们是相同的(根据需要)。

但是当我想取消引用提供的指针(op_ptr_array)时,问题就出现了。地址与指向的数组匹配时值错误(local)。

我的想法是,由于op_ptr_array(传递给函数的指针)的地址等于localop_ptr_array_(函数内部的数组和指针),所以使用for 循环*(op_ptr_array+i) 将给我i < op_size的结果。

我采取的方法如下:


#include <iostream>

void op_calculation(unsigned int*  ip_ptr_array_,
                    unsigned int   ip_size_,
                    unsigned int** op_ptr_array_,
                    unsigned int*  op_size_)
{
    *(op_size_) = ip_size_ + 2;
    std::cout<<"op_size_ address: "<<op_size_<<std::endl;
    std::cout<<"op_size_ value: "<<*(op_size_)<<std::endl;

    unsigned int local[*(op_size_)];
    std::cout<<"making local array to be pointed by op_ptr_array_\n";
    for (unsigned int i = 0; i< *(op_size_); i++)
    {
        local[i]=i+1*3;
        std::cout<<local[i]<<" ";
    }
    std::cout<<"\n";
    *op_ptr_array_ = &local[0];
    local[3] = 87; // for checking pointer charecter
    for (unsigned int i = 0; i < *(op_size_); i++)
        std::cout<<"array address: "<<&local[i]<<" ,op_ptr_array address: "<<(*op_ptr_array_)+i<<" ,val of array: "<<local[i]<<" ,val at op_ptr_array: "<<*((*op_ptr_array_)+i)<<std::endl;
        // here value and addresses are same which is desired
}

int main()
{
    unsigned int ip_size = 10;
    unsigned int* ip_ptr_array = new unsigned int[ip_size];

    unsigned int op_size;
    unsigned int* op_ptr_array;

    for(unsigned int i = 0; i < ip_size; i++)
    {
        ip_ptr_array[i] = i+2*2;
    }

    op_calculation(ip_ptr_array,
                ip_size,
                &op_ptr_array,
                &op_size);
    
    std::cout<<"Value printing after operation of op_calculation function\n";
    std::cout<<"op_size: "<<op_size<<std::endl;

    std::cout<<"op_ptr_array\n";
    for(unsigned int i = 0; i < op_size; i++)
        std::cout<<"Address: "<<(op_ptr_array+i)<<" , Value: "<<*(op_ptr_array+i)<<"\n";
        /* Here only addresses are same with `local array` and
        address pointed by op_ptr_array_ pointer` which you will find in op_calculation
        function but values are different*/
    std::cout<<"\n";

    return 0;
}

我在哪里弄得一团糟的任何想法都是非常明显的。

【问题讨论】:

  • 你想用这段代码做什么?
  • 这是我项目的sn-p
  • local 是方法本地的,而main 中的op_ptr_array 只是一个指针,一旦方法返回该指针就无效
  • 如果我想在main函数中用op_ptr_array获取local数组的值,该怎么办?
  • 有理由不使用std::arraystd::vector 吗?

标签: c++ arrays pointers


【解决方案1】:

变量local 被声明为局部变量(即在堆栈上)。当函数op_calculation 退出时,这超出了范围,这意味着最初用于分配local 的内存可能会用于其他用途。

这可以通过将local 转换为指针并使用new 为数组的内容分配内存或通过将本地声明为static 来纠正,这会将内容放在RAM 中的其他位置。请记住,如果您使用static,以后对op_calculation 的任何调用都将覆盖数组的内容,即使它仍在其他地方使用。如果您使用new,这不会有问题,但如果您使用new,则需要记住在不再需要时使用delete[] 释放数组。

【讨论】:

  • 通过阅读您的回答,我了解到--- 我已声明local,如下所示。 unsigned int* local = new unsigned int[*(op_size_)]; 在这种情况下 取消引用 有效。但我的问题是我现在将在哪个部分调用delete [] local?如果我在op_calculation 函数的末尾调用它,毫无疑问会导致错误。
  • 是的,这是正确的。抱歉,我在答案中提到了malloc,但你使用的是 C++,所以你会使用new。一旦op_calculation 退出,您将无法再访问local,但您可以使用delete[] op_ptr_array; 取消分配delete[] 关键字对指向数组的指针进行操作,并将取消分配指向的任何内容。
  • 但是,我已经声明了unsigned int* op_ptr_array;。我可以为此做delete [] op_ptr_array; 吗?我不确定这里的声明是否是动态分配的内存(到目前为止,我已经阅读了delete 运算符,如果我用new 声明任何内容,我可以使用)。也许我可以使用delete op_ptr_array;(不带方括号)。虽然两者都编译没有错误,但不明白要遵循的正确逻辑/流程是什么。
  • 存储在op_ptr_array 中的指针将由new 创建,当您在op_ptr_array 上使用delete 时,delete[] 运算符将使用它来解除分配。这里有一些关于delete[] 工作原理的详细信息:stackoverflow.com/questions/197675/…
  • 好的,现在我明白了。所以,如果我说op_ptr_array 指向op_ptr_array_op_ptr_array_ 指向local,对吗?此外,现在我在使用valgrind 执行二进制文件时遇到了问题。尽管如此,它仍无法释放所有堆内存 (still reachable: 32 bytes in 1 blocks)。
猜你喜欢
  • 2012-03-25
  • 2017-01-26
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 2019-03-11
相关资源
最近更新 更多