Сопоставить массив символов с буфером символов

#c

#c

Вопрос:

У меня есть двоичный файл, помещенный в массив символов. Некоторая часть файла может быть связана с struct s1 . В зависимости от значения в struct1 , будет N больше байтов, прежде чем можно будет назначить другое struct struct2 . Я хочу прочитать эти N байт в другой массив и передать их в другое место, но я не понял, как это сделать. Ниже приведена моя попытка.

 #include <stdlib.h>
#include <stdio.h>

struct s1{
    int x;
    int y;
    int N;
};

int main(){
    FILE *fp;
    fp = fopen("myfile.xyz", "rb");
    fseek(fp, 0, SEEK_END);
    int sz = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    // Populate buffer
    unsigned char buffer[sz];
    fread(buffer, sz, 1, fp);
    char *pos = (char*) buffer;  // current pos pointer to file buffer

    // map s1, starting at pos
    struct s1 *s1 = (struct s1*) pos;
    // extra code parsing of s1...
    pos  = sizeof(struct s1);  // increment pointer to after struct

    int N = 10; // should be read from s1 (i.e. it is not(!) a static number)
    char *temp = (char*) malloc((N 1)*sizeof(char));
    // assign temp to be N bytes, starting at pos...
    // parse_temp(temp);
    pos  = N;
    free(temp);
    return 0;
};
  

Я попытался создать цикл for следующим образом для заполнения temp :

 for(int i=0; i<N; i  ){
        *temp[i] = (char *) (pos i); //both temp[i] and *temp[i]...
    };
  

но ни одна из версий не компилируется. Также кажется, что этот подход сводит на нет идею простого сопоставления массива таким же образом, как для структуры, поскольку temp это новый блок памяти, не использующий «указатель на необработанную память» — я надеюсь, что приведение структуры выполняется.

Я медленно учусь c , так что это может быть тривиальный вопрос с правильными условиями поиска…

Комментарии:

1. Я почти уверен, что эта часть: struct s1 *s1 = (struct s1*) pos; … имеет неопределенное поведение из-за проблем с выравниванием.

2. Да, вы правы. В моем полном коде, который я использую #pragma pack(1) , забыл добавить его в этот MWE. Но спасибо, что указали на это.

3. Хорошо, так в чем именно заключается ваш вопрос?

4. Я бы хотел, чтобы мой массив символов temp был заполнен N байтами, начинающимися сразу после s1 , предпочтительно указывая на ту же память, что и buffer . Таким же образом, как структура просто размещается в памяти. Если это невозможно, я бы не возражал, скопировав каждый байт из buffer[sizeof(s1):sizeof(s1) N] в новый массив.

5. Массивы не указывают. temp это не массив (это указатель). Если вы хотите указать temp на buffer , сделайте temp = buffer; … или temp = pos; или любую другую позицию, которую вы хотите.