【问题标题】:Copying content of a file without any dynamic memory allocation functions在没有任何动态内存分配功能的情况下复制文件内容
【发布时间】:2020-05-11 14:12:31
【问题描述】:

我正在为具有不可靠的动态内存分配函数(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 矩阵)。

这是否可能(从文件中读取这样的结构而不使用动态内存分配函数)?如果是这样,最好的方法是什么?

【问题讨论】:

  • 嗯...在文件中存储指针有什么意义?
  • C->p_c 是否正确?你的结构 C 没有声明成员名称 p_c
  • @Ackdari 我在文本中打错字了(本来应该是 p_c)
  • 如果您理解正确,您希望加载一个文件,然后将其内容解析为您的结构C,而不使用动态内存,对吗?
  • 是的,如果可能的话

标签: c pointers struct


【解决方案1】:

我看到了两条路线:

您要么使用一些全局变量并实现自己的内存分配(甚至可能通过链接两个实现来替换 malloc 和 co. 的一个)。

或者您是一个全局缓冲区,用于将文件块读入内存,例如:

uint8_t buffer[1024];

int read_chunk(int fd) {
    int bytes_read = 0;

    while (bytes_read < 1024) {
        ssize_t res = read(fd, &buffer + bytes_read, 1024 - bytes_read);

        if (res < 0) return -1;
        else if (res == 0) break;
        else {
            bytes_read += res;      
        }
    }

    return bytes_read;
}

然后使用带有签名的函数

void parse(uint8_t* data, C* p_c);

你可以在堆栈分配的内存中解析你的文件。

C p_cs[2];
read_chunk(fd);
for (int i = 0; i < 2; i++) {
    parse(&buffer + (sizeof(C)*i), &p_cs[i]);
}

但是恕我直言,如果可能的话,你应该接受第一个建议。

【讨论】:

  • 我对编写一个简单的内存分配函数持怀疑态度,但我想你是对的,这就是要走的路。非常感谢您花时间写答案!
猜你喜欢
  • 2015-12-08
  • 2013-06-02
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 2021-06-11
  • 2017-03-30
相关资源
最近更新 更多