【问题标题】:How use pointer of pointers in C functions? [duplicate]如何在 C 函数中使用指针的指针? [复制]
【发布时间】:2021-11-14 06:24:54
【问题描述】:

我有一个分配,我必须在其中创建一个函数来分配一个块,该块的起始索引是 int 的倍数,称为“对齐”和给定大小。

函数原型是

int block_alloc(void ** ptr_addr, size_t alignment, size_t size)

假设我以这种方式调用块分配:

int a=0;
ptr = &a;
void* ptr_2 = ptr;
ret = block_alloc ( &ptr_2 ,2* sizeof ( void*) , 2* sizeof ( int ) ) ;

我正在做块分配

 ptr_addr = malloc ( sizeof (int) );

但是在打印指针时它会返回 &a 位置

我需要在给定的偏移量中进行 malloc 并完成所有工作,任何提示我做错了什么?

【问题讨论】:

  • 更改为*ptr_addr = malloc ( sizeof (int) );
  • malloc 中的地址偏移怎么办,这让我很困惑,因为我只能使用 c99 和 stdlib 函数
  • "一个名为 "alignment" 的 int 与 size_t alignment 冲突。是 int 还是 size_t。请详细说明 alignment 的用途。
  • " 任何提示我做错了什么?" @John Bode 发现了其中一个问题(一个关键问题)。
  • 是的,约翰的回答很完整,解决了我所有的疑问。

标签: c pointers malloc c99


【解决方案1】:

正如某个程序员老兄所说,你需要将表达式改为*ptr_addr = malloc(sizeof(int));,解释如下:

**ptr_addr 是指向需要用分配的空间修改的指针的指针,因此重新分配 ptr_addr = malloc(sizeof(int)); 只会修改指向该指针的指针的本地副本并创建泄漏而不是修改正在被修改的指针指向,因此* 取消引用双指针并允许您修改ptr_2 变量。

您的 malloc 调用也是错误的,因为您完全忽略了参数并仅为单个 int 分配大小。正确的 malloc 调用将是 malloc(size * alignment); 假设 alignment 是数组的初始大小(从“初始索引”猜测)。

【讨论】:

    【解决方案2】:

    记住基本模式:

    void update( T *ptr ) // for any type T
    {
      *ptr = new_T_value; // updates the thing ptr points to
    }
    
    void foo( void )
    {
      T var;
      update( &var ); // write a new value to var
    }
    

    现在让我们将T替换为指针类型P *

    void update( P **ptr )
    {
      *ptr = new_Pstar_value; // update the thing ptr points to
    }
    
    void foo( void )
    {
      P *var;
      update( &var ); // write a new value to var
    }
    

    在第二种情况下,var 的指针类型为P *,因此输入参数的类型为P **。但是我们还是要更新ptr指向的东西,所以还是写*ptr = ...

    所以在你的情况下,你会写

    *ptr_addr = malloc ( sizeof (int) );
    

    在您的 block_alloc 函数中,虽然我认为他们打算将内存分配为

    *ptr_addr = malloc( size * alignment ); 
    

    这分配了足够的内存来保存size 对象,每个对象都是alignment 字节宽。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多