gpt4 book ai didi

c - *( char** ) 实现什么类型的转换?

转载 作者:太空宇宙 更新时间:2023-11-04 06:46:40 26 4
gpt4 key购买 nike

*( char** ) 完成什么类型​​的转换?
它似乎用 ** 创建了一个指向指针(“双指针”)的指针。但是括号外的 * 让我感到困惑......下面是上下文中的转换:

void mem_test ( void )
{
void* m1;
void* m2;

...

m1 = 0;

while ( ( m2 = malloc( 10001 ) ) != 0 )
{
*( char** ) m2 = m1; // what does this cast mean?

m1 = m2;
}

...
}

它的另一个令人困惑的变体出现在以下代码片段中。 Actor 在这个场景中完成了什么,它与上面的不同吗?

void mpenter ( void );  // a function with no parameters and no return value

...

uchar* code;

...

*( void ( ** ) ( void ) ) ( code - 8 ) = mpenter; // what does this cast mean?

这种类型转换的正确名称是什么? IE。我应该搜索什么以了解更多信息?

最佳答案

内存测试

让我们一步一步地剖析这个。为简单起见,假设我们使用的是 64 位架构,其中指针的大小为 8 个字节。

  • m2 = malloc( 10001 )m2 分配给新分配的内存块。
  • (char **) m2 说“让我们假设地址 m2 处内存的前 8 个字节是一个 char*,然后指向在 that —— 产生一个 char**"
  • *(char **) m2 取消对上述内容的引用,导致 char* 的左值(在 C 语言中)。请记住左值是可写的。
    • 在 C++ 中,它会导致对 char* 的引用,即 char*&
  • *(char **) m2 = m1;m1 的值写入上面创建的左值。

编写该代码的另一种方法是:

char* pCurrentBuffer;
char* pPreviousBuffer;

pPreviousBuffer = NULL;
while ( ( pCurrentBuffer = malloc( 10001 ) ) != NULL )
{
char** ppPreviousBuffer = (char**)pCurrentBuffer;
*ppPreviousBuffer = pPreviousBuffer;

pPreviousBuffer = pCurrentBuffer;
}

惊喜(!),最后,它创建了一个链表。 (从技术上讲,这是一个反向链表,因为它们都是前一个指针而不是后一个指针,但我是在开玩笑)

mpenter

这是将地址 code - 8 处的 8 个字节转换为指向函数指针的指针,以便它可以将函数 mpenter 的地址分配给它位置。

  • void (*)(void) 是指向不带参数并返回 void 的函数的指针。
  • 通过扩展,void (**)(void) 是指向上述类型的函数指针的指针。
  • 解引用产生函数指针的左值。
    • 在 C++ 中,它会创建对函数指针的引用,如果这更容易推理的话。
  • 分配它会将 mpenter 的地址写入该左值(即地址 code - 8 处的 8 字节内存)

从指针获取负偏移量是不常见的,但如果 code 指向某种结构的中间,它可能是合法的(在某种宽泛的意义上)。

关于c - *( char** ) 实现什么类型的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57173541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com