如何在C中转储未知内存结构

如何在C中转储未知内存结构,c,memory,C,Memory,假设以下程序有多种用于存储的结构(这里只有2种),并且 一个结构用于处理存储结构 structure1和structure2结构是存储结构,大小不同。这些结构顺序存储在内存中,结构主体结构遍历内存以处理每个结构 structure1和structure2结构的大小不同,可以按任何顺序存储在内存块中 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct {

假设以下程序有多种用于存储的结构(这里只有2种),并且 一个结构用于处理存储结构

structure1和structure2结构是存储结构,大小不同。这些结构顺序存储在内存中,结构主体结构遍历内存以处理每个结构

structure1和structure2结构的大小不同,可以按任何顺序存储在内存块中

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

typedef struct
    {
    char attr1[30];
    int attr2;
    float attr3;
    } structure1;

typedef struct
    {
    short attr4;
    short attr5[5];
    char  attr6[40];
    } structure2;

typedef struct
    {
    char *headPointer;
    int mainStructureAttr1;
    char nameOfStruct[28];
    char *structPointer;
    } mainStructure;

int main(void)
{
    structure1 s1a = { "Hello From Structure 1 a.", 1, 3.14159f};
    structure1 s1b = { "Hello From Structure 1 b.", 2, 9.87654f};
    structure2 s2a = {"Hello From Structure 2", 3, 5.6789f};
    mainStructure mainS = {"\0", 101, "Hello From Main Structure.", "\0"};

    //Allocate a chunk of memory to store all the data. 
    mainS.structPointer = (char*)calloc(3, 100);//total 300
    ///1st structure inserted into memory
    memcpy(mainS.structPointer, &s1a, sizeof(structure1));
    //set headPointer to the start of the memory
    mainS.headPointer = mainS.structPointer;
    //Move the tracking pointer to the next part of memory.
    mainS.structPointer += sizeof(structure1);
    ///2nd structure inserted into memory
    memcpy(mainS.structPointer, &s2a, sizeof(structure2));
    //Move the tracking pointer to the next part of memory.
    mainS.structPointer += sizeof(structure2);
    ///3rd structure inserted into memory
    memcpy(mainS.structPointer, &s1b, sizeof(structure1));
    dumpMemory(mainS);
    printf("Done \n");

    return 0;
}

void dumpMemory(mainStructure mainS)
{
    printf ("=====Start Memory Dump=====\n");
    printf ("%s", mainS.headPointer);
    printf ("\n=====End Memory Dump=====\n");
}
#包括
#包括
#包括
类型定义结构
{
char attr1[30];
int attr2;
浮点数3;
}结构1;
类型定义结构
{
短纤维4;
短ATR5[5];
char attr6[40];
}结构2;
类型定义结构
{
字符*头指针;
int主结构属性1;
结构的字符名[28];
字符*结构指针;
}主体结构;
内部主(空)
{
结构1s1a={“结构1a.的你好”,1,3.14159f};
结构1s1b={“结构1b.的你好”,2,9.87654f};
结构2 s2a={“结构2的你好”,3,5.6789f};
主结构干线={“\0”,101,“主结构你好。”,“\0”};
//分配一块内存来存储所有数据。
mainS.structPointer=(char*)calloc(3100);//总计300
///第一个结构插入内存
memcpy(mainS.structPointer和s1a,sizeof(structure1));
//将头指针设置为内存的开头
mainS.headPointer=mainS.structPointer;
//将跟踪指针移动到内存的下一部分。
mainS.structPointer+=sizeof(structure1);
///第二个结构插入内存
memcpy(mainS.structPointer和s2a,sizeof(structure2));
//将跟踪指针移动到内存的下一部分。
mainS.structPointer+=sizeof(structure2);
///插入内存的第三个结构
memcpy(mainS.structPointer和s1b,sizeof(structure1));
主存储器;
printf(“完成”\n);
返回0;
}
无效转储内存(主结构干线)
{
printf(“==Start Memory Dump===n”);
printf(“%s”,mainS.headPointer);
printf(“\n=End内存转储=;
}
结构主体结构使用一个指针遍历内存,另一个指针指向内存结构的开头

我如何使用引用这一大块内存的指针并将其全部转储。 上面的代码尝试执行此操作,但由于使用了%s,因此它在第一个0处停止

假设dumpMemory()是某个外部库的一部分,它的唯一用途是转储一段内存


如何对dumpMemory()进行编码,以便它也转储headPointer指向的所有内存,这是内存的开头,包含所有结构化数据

除非你知道尺寸,否则这是不可能的。结构本身不知道它在内存中的结束或开始位置。它不必如此。
structure1
structure2
的大小如何变化?如果您不动态创建内存,那么它是在堆栈上创建的,您不需要转储(或
释放
)它…和
mainS.headPointer=mainS.structPointer应该是:
mainS.headPointer=&mainS.structPointer。不过,这不会创建内存,它只是将一个项目的位置分配给指针类型。
char*headPointer是一个很好的起点。了解更多关于。接下来,当您浏览该列表时,您需要在结构中添加一些其他成员,以帮助您区分它们。当然,如果您的结构在内存中相互跟随(代码不能保证这一点),那么您可能不需要链表——只需要结构区分符