Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在没有任何动态内存分配功能的情况下复制文件内容_C_Pointers_Struct - Fatal编程技术网

C 在没有任何动态内存分配功能的情况下复制文件内容

C 在没有任何动态内存分配功能的情况下复制文件内容,c,pointers,struct,C,Pointers,Struct,我正在为一个旧系统做一些编程,它有不可靠的动态内存分配函数malloc、calloc、realloc等等 我开始考虑在不使用任何这些函数的情况下加载文件。指定一个带有内存地址的指针,我将在其上加载文件内容,当我在文件中迭代时,该指针会增加,将需要的内容复制到结构变量中,或将内部结构的指针分配到该新地址。任何新文件都将加载到前一个文件的结束地址 对于这样的简单结构: typedef struct A { int a; int b; int c; }A; A a; 我用一个简单的me

我正在为一个旧系统做一些编程,它有不可靠的动态内存分配函数malloc、calloc、realloc等等

我开始考虑在不使用任何这些函数的情况下加载文件。指定一个带有内存地址的指针,我将在其上加载文件内容,当我在文件中迭代时,该指针会增加,将需要的内容复制到结构变量中,或将内部结构的指针分配到该新地址。任何新文件都将加载到前一个文件的结束地址

对于这样的简单结构:

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,对吗?是的,如果有可能的话,我在写一个简单的内存分配函数的问题上犹豫不决,但我想你是对的,这就是方向。非常感谢您抽出时间写下答案!