假设我希望符合以下结构中的内存模型(作为某个文件中的二进制数据):
typedef struct fileSection_s {
unsigned int a[ 3 ];
unsigned int b[ 3 ];
} fileSection_t;
有任意数量的fileSection_t
结构,并且使用 C,我想知道一种有效且不易出错的方法:
- 将任意数量的
fileSection_t
结构分配为缓冲区,而不使用容易出错的东西(?),例如fileSection_t** buf = (fileSection_t**) malloc( sizeof( fileSection_t* ) * count)
:
(即,尽可能避免使用双指针) - 使用 memcpy
uint8_t*
将从文件中读取的二进制数据的预先计算段放入所述缓冲区中,这意味着保存结构实例n
的数量。fileSection_t
fileSection_t
稍后(逐个地)访问所述实例,不是作为某种通用缓冲区类型(例如,void*
或uint8_t*
),而是作为fileSection_t*
(可能是指针算术/转换?)。
常见方法或众所周知的“最佳实践”的解释也将受到赞赏。
我的主要目标是本质上定义某种通用的类 C 接口,它允许我分配一些任意的类似缓冲区的对象并在其中存储我希望的任何类型的结构内存,而不会失去迭代的灵活性等等。 ..并且也具有通过使用pointer-to-pointer
机制获得的类似效果,尽管没有第二个指针。
例如,
#include <stdio.h>
#include <stdlib.h>
typedef struct fileSection_s {
unsigned int a[ 3 ];
unsigned int b[ 3 ];
} fileSection_t;
typedef struct buffer_s {
size_t elementSize;
unsigned int currentLength;
unsigned int maxLength;
void* mem; // or uint8_t*?
} buffer_t;
int main( void ) {
buffer_t* a = ( buffer_t* ) malloc( sizeof( buffer_t ) );
a->mem = malloc( sizeof( fileSection_t ) * count );
a->maxLength = count;
a->currentLength = 0;
a->elementSize = sizeof( fileSection_t );
FILE* f = fopen( "some_binary_data", "rb");
...
uint8_t* fileMemory = ( uint8_t* )malloc( size( uint8_t ) * fileSize ); // assume fileSize is obtained via ftell
fread( fileMemory, fileSize, sizeof( uint8_t ) );
...
...
// someOffset is obtained earlier
memcpy( a->mem, fileMemory + someOffset, sizeof( fileSection_t ) );
...
// now somehwere, we need to grab a section of our buffer and cast to fileSection_t.
return 0;
}
所以,我想做的是获取缓冲区的一部分并以安全的方式转换为指向 fileSection_t 的指针。该功能就像一个数组,但在这种情况下获得所述功能(至少,AFAIK)的方法涉及使用指针算术和字节转换。