Эта проблема называется " сериализация " и может варьироваться от тривиальной до действительно сложной. Если ваша структура данных самодостаточна, например, набор пикселей в массиве, и вы знаете размеры массива, вы можете просто выгрузить данные и затем прочитать их обратно.
Если у вас есть, например, связанные списки или указатели любого рода, в ваших данных, то эти указатели не будут указывать на что-либо действительное, когда вы прочитаете их обратно. Именно здесь начинает обретать смысл более формальный подход к сериализации.
Это может варьироваться от сохранения в качестве форматов файлов, использования баз данных, преобразования в XML или другой иерархический формат и так далее. То, что является правильным решением, полностью зависит от того, какие у вас есть данные и какие операции вы над ними выполняете, а также от того, как часто вы планируете записывать, а затем читать с диска. (Или сеть. Или что вы делаете.)
Если то, что у вас есть, является тривиальным блоком данных, и вы просто хотите записать его как можно проще, используйте fwrite () :
fwrite(my_pointer, MEMORY_SIZE, 1, fp);
, а затем fread () , чтобы прочитать данные обратно.
Также см. Связанный (более или менее связанный, в зависимости от того, насколько продвинуты ваши потребности) вопрос о сериализации в StackOverflow .
Правильная сериализация также решает проблемы, возникающие , когда предполагается, что разные типы процессоров могут считывать данные друг с друга. Правильная сериализация в Си намного сложнее, чем в других языках. Например, в Лиспе все данные и код уже сериализованы. В Java есть методы, которые помогут вам сериализовать ваши данные. Свойства C, делающие его подходящим языком для высокопроизводительного и системного программирования, также затрудняют его использование для некоторых других вещей.