【问题标题】:Access a specific byte area in a void * block访问 void * 块中的特定字节区域
【发布时间】:2021-03-14 13:52:06
【问题描述】:

假设我有一个 512 字节的块

void *block

例如,我如何在从第 100 个字节开始到第 150 个字节结束的区域中写入?我如何阅读这个区域?我认为

void *memcpy(void *dest, const void * src, size_t n)

无法帮助我,因为通过这个调用我只能获取第 n 个字节。任何帮助表示赞赏。提前致谢!

【问题讨论】:

  • void *block 不是一个 512 字节的块,它是一个指针变量,可能使用 2 到 4 个字节。顺便说一句,如果您将鼠标悬停在block 标签上,它会告诉您: 请勿使用此标签已计划删除,因为它可以引用许多不同的事物,具体取决于与它一起使用的其他标签。
  • char * 指针可以指向任何字节。您可以将其用于任何对象的直接字节访问。
  • void 类型(就定义变量而言)不能用于存储除地址以外的值到另一种类型。

标签: c byte block


【解决方案1】:

“例如,我如何在第 100 个字节开始到第 150 个字节结束的区域写入?”

首先,关于

void *block   

请注意,因为void 不是完整的object 类型。它不能用于存储任何类型的数据。然而,与其他类型不同,void * 可以 用于引用任何内存区域,无论 typechardoubleintstruct

例如,此语句将失败并显示:...error: array has incomplete element type 'void'

void buffer[2] = {'A', 'B'};

但是,以下内容将编译并工作:

char buffer[2] = {'A', 'B'};
void *pBuffer = &buffer;//use void * to reference address of buffer

ISO/IEC 9899:2017,§6.2.5 类型中:

  1. void 类型包含一组空值;它是一个不完整的对象类型,无法完成。

(More on the void keyword here.)

如图所示创建一个内存块,将其初始化为所有NULL,然后对块中您需要的区域进行分配:

int main(void)
{
    char memory_block[512] = {0};//define buffer with 512 bytes
    
    void *block = NULL;
    
    for(int i = 100;i < 149; i++)
    {
        *(memory_block + i) = 'A';//populate these locations with 'A'
    }
    //(or you could also use this syntax in the loop)
    // memory_block[99] = 'A';

    block = &memory_block[99]; //point block to specific area of memory containing data
    
    printf("contents of location 99-149 - in block: %s\n", (char *)block);
                                                         //type cast void * to char *
  
    return 0;
}

【讨论】:

  • 谢谢,但我需要阻止无效 *。我应该使用 malloc 分配 512 个字节,然后写入/读取。
  • @PanD22 - void * has limitations,但我已经修改以表明它可以指向已填充内存的区域,并打印该区域。
  • 是的,我知道,但不幸的是我必须使用 void *。具有这种限制的任何解决方案。
  • @PanD22 - void * 不能用作对象类型(如我的帖子的编辑中所述),即它不能用于存储任何类型的信息。然而,与其他类型不同的是,它可以用于指向任何内存区域,无论类型如何,chardouble , int struct 等。这是使 void 成为非常有用的类型的独特品质之一。
猜你喜欢
  • 2014-07-14
  • 2013-04-10
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2014-04-22
相关资源
最近更新 更多