假设我希望符合以下结构中列出的内存模型(作为某个文件中的二进制数据(:
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(的方法涉及使用指针算术和字节转换。
我不确定这是否回答了您的问题,但在 StackOverflow 上,似乎使用 malloc 的公认做法是
type *ptr = malloc(sizeof(*p))
和
type *array = malloc(sizeof(*array) * n)
sizeof(( 中没有类型,也没有强制转换。这是使用 malloc 最不容易出错的方法。