-1

假设我希望符合以下结构中的内存模型(作为某个文件中的二进制数据):

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)
    (即,尽可能避免使用双指针)
  • 使用 memcpyuint8_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)的方法涉及使用指针算术和字节转换。

4

1 回答 1

1

我不确定这是否能回答您的问题,但在 StackOverflow 上,使用 malloc 的公认做法似乎是

type *ptr = malloc(sizeof(*p))

type *array = malloc(sizeof(*array) * n)

sizeof() 中没有类型,也没有强制转换。这是使用 malloc 最不容易出错的方法。

于 2013-10-10T16:33:54.127 回答