C 在没有任何动态内存分配功能的情况下复制文件内容
我正在为一个旧系统做一些编程,它有不可靠的动态内存分配函数malloc、calloc、realloc等等 我开始考虑在不使用任何这些函数的情况下加载文件。指定一个带有内存地址的指针,我将在其上加载文件内容,当我在文件中迭代时,该指针会增加,将需要的内容复制到结构变量中,或将内部结构的指针分配到该新地址。任何新文件都将加载到前一个文件的结束地址 对于这样的简单结构:C 在没有任何动态内存分配功能的情况下复制文件内容,c,pointers,struct,C,Pointers,Struct,我正在为一个旧系统做一些编程,它有不可靠的动态内存分配函数malloc、calloc、realloc等等 我开始考虑在不使用任何这些函数的情况下加载文件。指定一个带有内存地址的指针,我将在其上加载文件内容,当我在文件中迭代时,该指针会增加,将需要的内容复制到结构变量中,或将内部结构的指针分配到该新地址。任何新文件都将加载到前一个文件的结束地址 对于这样的简单结构: typedef struct A { int a; int b; int c; }A; A a; 我用一个简单的me
typedef struct A
{
int a;
int b;
int c;
}A;
A a;
我用一个简单的memcpy复制内容,然后增加指针
memcpy(&a, pointer_to_the_file, sizeof(A));
pointer_to_the_file += sizeof(A)
这很有效。对于之前我会使用一些动态分配的结构,如:
typedef struct B
{
A* p_a;
A* p_b;
}B;
B b;
我直接分配指针:
b->p_a = (B *)pointer_to_the_file;
//then increase the pointer
pointer_to_the_file += sizeof(B) * num_of_p_a_elements;
这似乎也行。
但当我转向更复杂的结构时,我开始遇到一些问题:
typedef struct C
{
A p_a_1;
A* p_a_2;
B** p_b;
}C;
C *p_c;
在这里,我不知道如何正确处理它。我做到了:
p_c = (C *)pointer_to_the_file;
但是我没有得到p_a_1的预期结果,尽管p_c的地址指向p_a_1的正确值所在的正确位置。我试着使用C p_C[0];然后p_a_1的值是正确的,但我不知道为什么会起作用,所以我不想在此基础上构建它,然后再找出它导致的问题。
此外,我也无法理解如何使用[0]技巧为p_c->p_b分配一个非正方形2d矩阵
在不使用dnyamic内存alloc函数的情况下,从文件中读取这样的结构是完全可能的吗?如果是这样的话,最好的方法是什么?我认为有两种方法: 要么使用一些全局变量,实现自己的内存分配,甚至可能通过将两个变量链接到实现来替换malloc和co的内存分配 或者使用globale缓冲区将文件块读入内存,如: uint8_t缓冲器[1024]; int read_chunkint fd{ int bytes_read=0; 当字节读取<1024时{ ssize\u t res=readfd,&buffer+bytes\u read,1024-bytes\u read; 如果res<0,返回-1; 如果res==0,则为else; 否则{ 字节_read+=res; } } 返回读取的字节数; } 然后是一个带有签名的函数 void parseuint8_t*数据,C*p_C; 您可以像解析堆栈分配的内存一样解析文件 C p_cs[2]; 阅读(fd);; 对于int i=0;i<2;i++{ parse&buffer+sizeofC*i和p_cs[i]; }
但是如果可能的话,我想你应该接受第一个建议。嗯。。。在文件中存储指针有什么意义?C->p_C如何正确?结构C没有声明成员名p_c@Ackdari我在文本中输入了一个拼写错误,它的意思是p_c,如果你理解正确,你想加载一个文件,然后在不使用动态内存的情况下将其内容解析为你的结构c,对吗?是的,如果有可能的话,我在写一个简单的内存分配函数的问题上犹豫不决,但我想你是对的,这就是方向。非常感谢您抽出时间写下答案!